From d7f3ee11902de88cce3f3b4ee3a2cfb634102c24 Mon Sep 17 00:00:00 2001 From: Robert Date: Sun, 27 Mar 2022 11:55:26 +0200 Subject: [PATCH] Meta - Replace WPF projects with Avalonia projects --- .../Artemis.UI.Linux/.gitignore | 0 src/{Avalonia => }/Artemis.UI.Linux/App.axaml | 0 .../Artemis.UI.Linux/App.axaml.cs | 0 .../ApplicationStateManager.cs | 0 .../Artemis.UI.Linux/Artemis.UI.Linux.csproj | 3 +- .../Artemis.UI.Linux/Assets/avalonia-logo.ico | Bin .../Artemis.UI.Linux/Program.cs | 0 .../Providers/Input/LinuxAbsoluteAxis.cs | 0 .../Providers/Input/LinuxInputDevice.cs | 0 .../Providers/Input/LinuxInputDeviceFinder.cs | 0 .../Providers/Input/LinuxInputDeviceReader.cs | 0 .../Providers/Input/LinuxInputEventArgs.cs | 0 .../Providers/Input/LinuxInputEventType.cs | 0 .../Providers/Input/LinuxInputProvider.cs | 0 .../Providers/Input/LinuxKeyboardKeyCodes.cs | 0 .../Providers/Input/LinuxRelativeAxis.cs | 0 .../Utilities/InputUtilities.cs | 0 src/Artemis.UI.Linux/packages.lock.json | 1828 ++++++++++++++++ .../Artemis.UI.MacOS/.gitignore | 0 src/{Avalonia => }/Artemis.UI.MacOS/App.axaml | 0 .../Artemis.UI.MacOS/App.axaml.cs | 0 .../Artemis.UI.MacOS/Artemis.UI.MacOS.csproj | 3 +- .../Artemis.UI.MacOS/Assets/avalonia-logo.ico | Bin .../Artemis.UI.MacOS/Program.cs | 0 src/Artemis.UI.MacOS/packages.lock.json | 1828 ++++++++++++++++ ...emis.UI.Avalonia.Shared.csproj.DotSettings | 0 .../Artemis.UI.Avalonia.Shared.xml | 0 .../Artemis.UI.Shared.csproj | 98 +- .../Artemis.UI.Shared.csproj.DotSettings | 18 +- .../AttachedProperties/NumberBoxAssist.cs | 0 .../AttachedProperties/TextBoxAssist.cs | 0 .../LostFocusNumberBoxBindingBehavior.cs | 0 .../LostFocusTextBoxBindingBehavior.cs | 0 .../Behaviors/OpenInBrowser.cs | 41 - .../PutCursorAtEndTextBoxBehavior.cs | 40 - .../Behaviors/ScrollParentWhenAtMax.cs | 60 - src/Artemis.UI.Shared/Bootstrapper.cs | 34 - .../Controls/ArtemisIcon.axaml | 0 .../Controls/ArtemisIcon.axaml.cs | 0 .../Controls/ArtemisIcon.xaml | 29 - .../Controls/ArtemisIcon.xaml.cs | 101 - .../Controls/ColorPicker.xaml | 159 -- .../Controls/ColorPicker.xaml.cs | 303 --- .../Controls/DataModelPicker.xaml | 75 - .../Controls/DataModelPicker.xaml.cs | 343 --- .../DataModelPicker/DataModelPicker.cs | 0 .../DataModelPicker/DataModelPickerButton.cs | 0 .../Controls/DeviceVisualizer.cs | 481 ++--- .../Controls/DeviceVisualizerLed.cs | 154 +- .../Controls/DraggableFloat.xaml | 71 - .../Controls/DraggableFloat.xaml.cs | 303 --- .../Controls/EnumComboBox.axaml | 0 .../Controls/EnumComboBox.axaml.cs | 0 .../Controls/Flyouts/DataModelPickerFlyout.cs | 0 .../Controls/Flyouts/GradientPickerFlyout.cs | 0 .../Controls/GradientPicker.xaml | 45 - .../Controls/GradientPicker.xaml.cs | 171 -- .../Controls/GradientPicker/GradientPicker.cs | 0 .../GradientPicker/GradientPickerButton.cs | 0 .../GradientPicker/GradientPickerColorStop.cs | 0 .../Controls/HotkeyBox.axaml | 0 .../Controls/HotkeyBox.axaml.cs | 0 .../Controls/LockableToggleButton.cs | 32 - .../Controls/NoInputTextBox.cs | 0 .../Controls/ProfileConfigurationIcon.axaml | 0 .../ProfileConfigurationIcon.axaml.cs | 0 .../Controls/ProfileConfigurationIcon.xaml | 65 - .../Controls/ProfileConfigurationIcon.xaml.cs | 35 - .../Controls/SelectionRectangle.cs | 0 .../ColorGradientToGradientStopsConverter.cs | 57 +- .../Converters/ColorToSKColorConverter.cs | 34 +- .../Converters/ColorToSolidColorConverter.cs | 29 - .../Converters/ColorToStringConverter.cs | 41 - .../Converters/EnumToBooleanConverter.cs | 0 .../Converters/IntToVisibilityConverter.cs | 39 - .../Converters/NullToVisibilityConverter.cs | 42 - .../ParentWidthPercentageConverter.cs | 0 .../Converters/SKColorToBrushConverter.cs | 0 .../Converters/SKColorToColorConverter.cs | 0 .../Converters/SKColorToStringConverter.cs | 37 +- .../StreamToBitmapImageConverter.cs | 42 - .../Converters/StreamToSvgImageConverter.cs | 48 - .../Converters/StringToNumericConverter.cs | 27 - .../Converters/TypeToStringConverter.cs | 8 +- .../Converters/WidthNormalizedConverter.cs | 0 .../DataModelDisplayViewModel.cs | 14 +- .../DataModelInputViewModel.cs | 34 +- .../DataModelVisualizationRegistration.cs | 3 +- .../Shared/DataModelEventViewModel.cs | 6 +- .../Shared/DataModelListItemViewModel.cs | 0 .../DataModelListPropertiesViewModel.cs | 82 - .../Shared/DataModelListPropertyViewModel.cs | 71 - .../Shared/DataModelListViewModel.cs | 46 +- .../Shared/DataModelPropertiesViewModel.cs | 8 +- .../Shared/DataModelPropertyViewModel.cs | 10 +- .../Shared/DataModelUpdateConfiguration.cs | 2 +- .../Shared/DataModelVisualizationViewModel.cs | 694 ++++--- .../Display/DefaultDataModelDisplayView.axaml | 0 .../DefaultDataModelDisplayView.axaml.cs | 0 .../DefaultDataModelDisplayViewModel.cs | 40 +- .../DependencyProperties/SizeObserver.cs | 109 - .../Events/DataModelSelectedEventArgs.cs | 2 +- .../Events/DialogClosedEventArgs.cs | 0 .../Events/LedClickedEventArgs.cs | 2 +- .../Events/ProfileConfigurationEventArgs.cs | 2 +- .../Events/RenderProfileElementEventArgs.cs | 2 +- .../Events/SelectionRectangleEventArgs.cs | 0 .../Extensions/ControlExtensions.cs | 0 .../Extensions/LayerExtensions.cs | 0 .../Extensions/PointExtensions.cs | 0 .../Extensions/SKColorExtensions.cs | 0 .../Extensions/SKMatrixExtensions.cs | 0 .../Extensions/SKRectExtensions.cs | 0 .../Extensions/TypeExtensions.cs | 0 .../Extensions/VisualExtensions.cs | 0 .../Ninject/Factories/ISharedVMFactory.cs | 9 - .../Ninject/SharedUIModule.cs | 16 +- .../BrushConfigurationViewModel.cs | 48 +- .../LayerBrushConfigurationDialog.cs | 2 +- .../EffectConfigurationViewModel.cs | 78 +- .../LayerEffectConfigurationDialog.cs | 2 +- .../Plugins/Modules/ModuleViewModel.cs | 27 - .../Plugins/PluginConfigurationDialog.cs | 4 +- .../Plugins/PluginConfigurationViewModel.cs | 37 +- .../ScriptEditorViewModel.cs | 6 +- .../Properties/Annotations.cs | 1383 ------------- .../Properties/AssemblyInfo.cs | 26 - .../Properties/DesignTimeResources.xaml | 8 - .../Properties/Resources.Designer.cs | 62 - .../Properties/Resources.resx | 117 -- .../Properties/Settings.Designer.cs | 30 - .../Properties/Settings.settings | 8 - .../PropertyInputRegistration.cs | 52 - .../PropertyInput/PropertyInputViewModel.cs | 236 --- .../IColorGradientStorageProvider.cs | 0 .../Providers/ICursorProvider.cs | 0 .../DataModelConditions.xaml | 108 - .../Resources/ArtemisShared.xaml | 45 - .../Resources/Fonts/RobotoMono-Regular.ttf | Bin 109212 -> 0 bytes .../Screens/Dialogs/ConfirmDialogView.xaml | 40 - .../Screens/Dialogs/ConfirmDialogViewModel.cs | 26 - .../Screens/Exceptions/ExceptionView.xaml | 68 - .../Screens/Exceptions/ExceptionViewModel.cs | 32 - .../Screens/GradientEditor/ColorStopView.xaml | 89 - .../GradientEditor/ColorStopViewModel.cs | 127 -- .../GradientEditor/GradientEditorView.xaml | 219 -- .../GradientEditor/GradientEditorViewModel.cs | 247 --- .../Services/Builders/ContentDialogBuilder.cs | 0 .../Builders/FileDialogFilterBuilder.cs | 0 .../Services/Builders/NotificationBuilder.cs | 0 .../Builders/OpenFileDialogBuilder.cs | 0 .../Builders/SaveFileDialogBuilder.cs | 0 .../Services/ColorPickerService.cs | 96 - .../Services/DataModelUIService.cs | 5 +- .../Services/Dialog/DialogService.cs | 134 -- .../Services/Dialog/DialogViewModelBase.cs | 68 - .../Services/Dialog/DialogViewModelHost.cs | 29 - .../Services/GradientPickerService.cs | 0 .../Interfaces/IArtemisSharedUIService.cs | 2 +- .../Interfaces/IColorPickerService.cs | 20 - .../Interfaces/IDataModelUIService.cs | 4 +- .../Services/Interfaces/IDialogService.cs | 86 - .../Interfaces/INotificationService.cs | 0 .../Interfaces/IProfileEditorService.cs | 241 --- .../Services/Interfaces/IWindowService.cs | 0 .../MainWindow/IMainWindowProvider.cs | 0 .../Services/MainWindow/IMainWindowService.cs | 0 .../Services/MainWindow/MainWindowService.cs | 0 .../Services/Message/IMessageService.cs | 150 -- .../Services/Message/INotificationProvider.cs | 22 - .../Services/Message/MessageService.cs | 107 - .../Services/Models/FolderClipboardModel.cs | 79 - .../Services/NodeEditor/Commands/AddNode.cs | 0 .../Services/NodeEditor/Commands/AddPin.cs | 0 .../NodeEditor/Commands/CompositeCommand.cs | 0 .../NodeEditor/Commands/ConnectPins.cs | 0 .../NodeEditor/Commands/DeleteNode.cs | 0 .../Services/NodeEditor/Commands/MoveNode.cs | 0 .../Services/NodeEditor/Commands/RemovePin.cs | 0 .../NodeEditor/Commands/UpdateStorage.cs | 0 .../Services/NodeEditor/INodeEditorCommand.cs | 0 .../Services/NodeEditor/INodeEditorService.cs | 0 .../NodeEditor/NodeEditorCommandScope.cs | 0 .../Services/NodeEditor/NodeEditorHistory.cs | 0 .../Services/NodeEditor/NodeEditorService.cs | 0 .../Services/NotificationService.cs | 0 .../Commands/AddProfileElement.cs | 0 .../Commands/ChangeKeyframeEasing.cs | 0 .../Commands/ChangeLayerBrush.cs | 0 .../ProfileEditor/Commands/ChangeLayerLeds.cs | 0 .../Commands/CompositeCommand.cs | 0 .../ProfileEditor/Commands/DeleteKeyframe.cs | 0 .../ProfileEditor/Commands/MoveKeyframe.cs | 0 .../Commands/MoveProfileEElement.cs | 0 .../Commands/RemoveProfileElement.cs | 0 .../Commands/RenameProfileElement.cs | 0 .../Commands/ResetLayerProperty.cs | 0 .../Commands/ResizeTimelineSegment.cs | 0 .../Commands/ToggleLayerPropertyKeyframes.cs | 0 .../Commands/UpdateLayerProperty.cs | 0 .../ProfileEditor/IProfileEditorCommand.cs | 0 .../ProfileEditor/IProfileEditorService.cs | 0 .../Services/ProfileEditor/IToolViewModel.cs | 0 .../ProfileEditorCommandScope.cs | 0 .../ProfileEditor/ProfileEditorHistory.cs | 0 .../ProfileEditor/ProfileEditorService.cs | 0 .../Services/ProfileEditorService.cs | 576 ----- .../PropertyInput/IPropertyInputService.cs | 0 .../PropertyInputRegistration.cs | 0 .../PropertyInput/PropertyInputService.cs | 0 .../PropertyInput/PropertyInputViewModel.cs | 0 .../Services/Window/ExceptionDialogView.axaml | 0 .../Window/ExceptionDialogView.axaml.cs | 0 .../Window/ExceptionDialogViewModel.cs | 0 .../Services/Window/IMainWindowProvider.cs | 39 - .../Services/Window/IWindowService.cs | 41 - .../Services/Window/WindowService.cs | 162 +- .../Artemis.UI.Shared/Styles/Artemis.axaml | 0 .../Artemis.UI.Shared/Styles/Border.axaml | 0 .../Artemis.UI.Shared/Styles/Button.axaml | 0 .../Artemis.UI.Shared/Styles/Condensed.axaml | 0 .../Styles/Controls/DataModelPicker.axaml | 0 .../Controls/DataModelPickerButton.axaml | 0 .../Styles/Controls/GradientPicker.axaml | 0 .../Controls/GradientPickerButton.axaml | 0 .../Artemis.UI.Shared/Styles/InfoBar.axaml | 0 .../Styles/Notifications.axaml | 0 .../Artemis.UI.Shared/Styles/NumberBox.axaml | 0 .../Artemis.UI.Shared/Styles/Sidebar.axaml | 0 .../Artemis.UI.Shared/Styles/TextBlock.axaml | 0 .../Artemis.UI.Shared/Styles/TextBox.axaml | 0 .../Artemis.UI.Shared/Styles/TreeView.axaml | 0 .../Utilities/BindingProxy.cs | 36 - .../Utilities/DelegateCommand.cs | 60 - .../Utilities/EnumUtilities.cs | 63 - .../Utilities/HitTestUtilities.cs | 38 - .../Utilities/JsonClipboard.cs | 58 - .../Utilities/ShortcutUtilities.cs | 147 -- .../Utilities/TriggerTracing.cs | 200 -- .../Utilities/TypeUtilities.cs | 43 - .../Utilities/VisualTreeUtilities.cs | 98 - .../Artemis.UI.Shared/ViewModelBase.cs | 0 .../VisualScripting/CustomNodeViewModel.cs | 0 .../Artemis.UI.Shared/nuget.config | 0 src/Artemis.UI.Shared/packages.lock.json | 560 ++++- .../Artemis.UI.Windows/.gitignore | 0 .../Artemis.UI.Windows/App.axaml | 0 .../Artemis.UI.Windows/App.axaml.cs | 0 .../ApplicationStateManager.cs | 0 .../Artemis.UI.Windows.csproj | 3 +- .../Assets/Cursors/aero_crosshair.png | Bin .../Assets/Cursors/aero_crosshair_minus.png | Bin .../Assets/Cursors/aero_crosshair_plus.png | Bin .../Assets/Cursors/aero_drag.png | Bin .../Assets/Cursors/aero_drag_horizontal.png | Bin .../Assets/Cursors/aero_pen_min.png | Bin .../Assets/Cursors/aero_pen_plus.png | Bin .../Assets/Cursors/aero_rotate.png | Bin .../Assets/Cursors/aero_rotate_bl.png | Bin .../Assets/Cursors/aero_rotate_br.png | Bin .../Assets/Cursors/aero_rotate_tl.png | Bin .../Assets/Cursors/aero_rotate_tr.png | Bin .../Assets/avalonia-logo.ico | Bin .../Ninject/WindowsModule.cs | 0 .../Artemis.UI.Windows/Program.cs | 0 .../Properties/launchSettings.json | 0 .../Providers/CursorProvider.cs | 0 .../Providers/Input/SpongeWindow.cs | 0 .../Providers/Input/SpongeWindowEventArgs.cs | 0 .../Providers/Input/WindowsInputProvider.cs | 0 .../Utilities/InputUtilities.cs | 0 .../Utilities/ProcessUtilities.cs | 0 .../Utilities/WindowUtilities.cs | 0 src/Artemis.UI.Windows/packages.lock.json | 1844 +++++++++++++++++ src/Artemis.UI/App.xaml | 63 - src/Artemis.UI/App.xaml.cs | 11 - src/Artemis.UI/ApplicationStateManager.cs | 200 -- .../Artemis.UI.Avalonia.csproj.DotSettings | 0 src/Artemis.UI/Artemis.UI.csproj | 450 +--- .../Artemis.UI/Artemis.UI.csproj.DotSettings | 0 .../Artemis.UI/ArtemisBootstrapper.cs | 0 .../Artemis.UI/ArtemisTrayIcon.axaml | 0 .../Assets/Images/Logo/application.ico | Bin .../Images/Logo/bow-black.ico | Bin .../Images/Logo/bow-white.ico | Bin .../Images/Logo/bow-white.svg | 0 .../{Resources => Assets}/Images/Logo/bow.ico | Bin .../{Resources => Assets}/Images/Logo/bow.svg | 0 .../Artemis.UI/Assets/Images/home-banner.png | Bin .../Artemis.UI/Assets/avalonia-logo.ico | Bin .../Behaviors/HighlightTermBehavior.cs | 169 -- .../Behaviors/InputBindingBehavior.cs | 65 - src/Artemis.UI/Behaviors/MouseBehavior.cs | 39 - .../Behaviors/SimpleContextDragBehavior.cs | 0 .../Behaviors/TreeItemDragBehavior.cs | 0 .../Behaviors/TreeViewSelectionBehavior.cs | 179 -- src/Artemis.UI/Bootstrapper.cs | 165 -- .../Controllers/RemoteController.cs | 39 - .../Artemis.UI/Controls/TimelineHeader.cs | 0 .../Converters/ColorLuminosityConverter.cs | 0 .../Converters/ColorOpacityConverter.cs | 0 .../ColorToSolidColorBrushConverter.cs | 21 +- .../Converters/ComparisonConverter.cs | 19 - .../Converters/DoubleToGridLengthConverter.cs | 0 .../Converters/EnumToCollectionConverter.cs | 48 - .../Converters/InverseBooleanConverter.cs | 34 - .../Converters/LedIdToStringConverter.cs | 9 +- .../LeftMarginMultiplierConverter.cs | 28 - .../NormalizedPercentageConverter.cs | 7 +- .../Converters/NullToBooleanConverter.cs | 40 - .../Converters/NullToImageConverter.cs | 22 - .../Converters/PropertyTreeMarginConverter.cs | 0 .../Converters/SKColorToColor2Converter.cs | 0 .../SolidColorBrushToColorConverter.cs | 29 - .../Converters/UriToFileNameConverter.cs | 9 +- .../Converters/ValuesAdditionConverter.cs | 13 +- .../ComboBoxTemplateSelector.cs | 53 - .../Display/SKColorDataModelDisplayView.xaml | 64 - .../SKColorDataModelDisplayViewModel.cs | 9 - .../Input/BoolDataModelInputView.xaml | 22 - .../Input/BoolDataModelInputViewModel.cs | 12 - .../Input/DoubleDataModelInputView.xaml | 22 - .../Input/DoubleDataModelInputViewModel.cs | 25 - .../Input/EnumDataModelInputView.xaml | 24 - .../Input/EnumDataModelInputViewModel.cs | 17 - .../Input/IntDataModelInputView.xaml | 22 - .../Input/IntDataModelInputViewModel.cs | 20 - .../Input/SKColorDataModelInputView.xaml | 20 - .../Input/SKColorDataModelInputViewModel.cs | 13 - .../Input/StringDataModelInputView.xaml | 16 - .../Input/StringDataModelInputViewModel.cs | 18 - .../PropertyInput/BoolPropertyInputView.axaml | 0 .../BoolPropertyInputView.axaml.cs | 0 .../PropertyInput/BoolPropertyInputView.xaml | 27 - .../BoolPropertyInputViewModel.cs | 40 +- .../BrushPropertyInputView.axaml | 0 .../BrushPropertyInputView.axaml.cs | 0 .../PropertyInput/BrushPropertyInputView.xaml | 35 - .../BrushPropertyInputViewModel.cs | 150 +- .../ColorGradientPropertyInputView.axaml | 0 .../ColorGradientPropertyInputView.axaml.cs | 0 .../ColorGradientPropertyInputView.xaml | 23 - .../ColorGradientPropertyInputViewModel.cs | 87 +- .../PropertyInput/EnumPropertyInputView.axaml | 0 .../EnumPropertyInputView.axaml.cs | 0 .../PropertyInput/EnumPropertyInputView.xaml | 24 - .../EnumPropertyInputViewModel.cs | 22 +- .../FloatPropertyInputView.axaml | 0 .../FloatPropertyInputView.axaml.cs | 0 .../PropertyInput/FloatPropertyInputView.xaml | 25 - .../FloatPropertyInputViewModel.cs | 38 +- .../FloatRangePropertyInputView.axaml | 0 .../FloatRangePropertyInputView.axaml.cs | 0 .../FloatRangePropertyInputView.xaml | 33 - .../FloatRangePropertyInputViewModel.cs | 105 +- .../PropertyInput/IntPropertyInputView.axaml | 0 .../IntPropertyInputView.axaml.cs | 0 .../PropertyInput/IntPropertyInputView.xaml | 25 - .../IntPropertyInputViewModel.cs | 38 +- .../IntRangePropertyInputView.axaml | 0 .../IntRangePropertyInputView.axaml.cs | 0 .../IntRangePropertyInputView.xaml | 33 - .../IntRangePropertyInputViewModel.cs | 105 +- .../PropertyInput/PropertyInputStyles.axaml | 0 .../SKColorPropertyInputView.axaml | 0 .../SKColorPropertyInputView.axaml.cs | 0 .../SKColorPropertyInputView.xaml | 26 - .../SKColorPropertyInputViewModel.cs | 5 +- .../SKPointPropertyInputView.axaml | 0 .../SKPointPropertyInputView.axaml.cs | 0 .../SKPointPropertyInputView.xaml | 33 - .../SKPointPropertyInputViewModel.cs | 77 +- .../SKSizePropertyInputView.axaml | 0 .../SKSizePropertyInputView.axaml.cs | 0 .../SKSizePropertyInputView.xaml | 33 - .../SKSizePropertyInputViewModel.cs | 78 +- .../StringPropertyInputView.axaml | 0 .../StringPropertyInputView.axaml.cs | 0 .../StringPropertyInputViewModel.cs | 0 .../Events/MainWindowFocusChangedEvent.cs | 12 - src/Artemis.UI/Events/MainWindowKeyEvent.cs | 18 - src/Artemis.UI/Events/MainWindowMouseEvent.cs | 18 - .../Events/RequestSelectSidebarItemEvent.cs | 20 - .../Events/ShapeControlEventArgs.cs | 31 - .../Events/WindowsThemeEventArgs.cs | 16 - .../BindableCollectionExtensions.cs | 6 +- .../Extensions/RgbColorExtensions.cs | 14 - .../Extensions/RgbRectangleExtensions.cs | 18 - src/Artemis.UI/Extensions/ScreenExtensions.cs | 20 - .../Extensions/TreeViewItemExtensions.cs | 25 - .../Artemis.UI/MainWindow.axaml | 0 .../Artemis.UI/MainWindow.axaml.cs | 0 .../Ninject/Factories/IVMFactory.cs | 205 +- .../LayerPropertyViewModelInstanceProvider.cs | 6 +- src/Artemis.UI/Ninject/PluginUIModule.cs | 38 - src/Artemis.UI/Ninject/UiModule.cs | 53 +- .../Ninject/ViewsSelfBindingResolver.cs | 75 - src/Artemis.UI/Properties/AssemblyInfo.cs | 28 - .../PublishProfiles/FolderProfile.pubxml | 17 - .../Properties/Resources.Designer.cs | 237 --- src/Artemis.UI/Properties/Resources.resx | 169 -- .../Properties/Settings.Designer.cs | 26 - src/Artemis.UI/Properties/Settings.settings | 8 - src/Artemis.UI/Properties/launchSettings.json | 8 - .../Providers/NativeWindowInputProvider.cs | 285 --- src/Artemis.UI/Providers/SpongeWindow.cs | 26 - .../Providers/ToastNotificationProvider.cs | 97 - .../Artemis.UI/ReactiveCoreWindow.cs | 0 .../DataModelConditions.xaml | 99 - .../LayerBrushDescriptors.xaml | 26 - .../ResourceDictionaries/Scrollbar.xaml | 142 -- .../ResourceDictionaries/SideNavigation.xaml | 49 - .../Resources/Artemis 2 - Autorun.xml | Bin 3410 -> 0 bytes .../Resources/Cursors/aero_crosshair.cur | Bin 4286 -> 0 bytes .../Cursors/aero_crosshair_minus.cur | Bin 4286 -> 0 bytes .../Resources/Cursors/aero_crosshair_plus.cur | Bin 4286 -> 0 bytes .../Resources/Cursors/aero_drag.cur | Bin 4286 -> 0 bytes .../Resources/Cursors/aero_drag_ew.cur | Bin 4286 -> 0 bytes .../Resources/Cursors/aero_fill.cur | Bin 13942 -> 0 bytes .../Resources/Cursors/aero_pen_min.cur | Bin 4286 -> 0 bytes .../Resources/Cursors/aero_pen_plus.cur | Bin 4286 -> 0 bytes .../Resources/Cursors/aero_rotate.cur | Bin 4286 -> 0 bytes .../Resources/Cursors/aero_rotate_bl.cur | Bin 4286 -> 0 bytes .../Resources/Cursors/aero_rotate_br.cur | Bin 4286 -> 0 bytes .../Resources/Cursors/aero_rotate_tl.cur | Bin 4286 -> 0 bytes .../Resources/Cursors/aero_rotate_tr.cur | Bin 4286 -> 0 bytes .../Resources/Fonts/RobotoMono-Regular.ttf | Bin 109212 -> 0 bytes .../Resources/Images/PhysicalLayouts/abnt.png | Bin 27843 -> 0 bytes .../Resources/Images/PhysicalLayouts/ansi.png | Bin 27167 -> 0 bytes .../Resources/Images/PhysicalLayouts/iso.png | Bin 27664 -> 0 bytes .../Resources/Images/PhysicalLayouts/jis.png | Bin 28370 -> 0 bytes .../Resources/Images/PhysicalLayouts/ks.png | Bin 27508 -> 0 bytes .../Images/Sidebar/sidebar-header.png | Bin 7429 -> 0 bytes .../Screens/Debugger/DebugView.axaml | 0 .../Screens/Debugger/DebugView.axaml.cs | 0 .../Screens/Debugger/DebugViewModel.cs | 0 .../Tabs/DataModel/DataModelDebugView.axaml | 0 .../DataModel/DataModelDebugView.axaml.cs | 0 .../Tabs/DataModel/DataModelDebugViewModel.cs | 0 .../Debugger/Tabs/Logs/LogsDebugView.axaml | 0 .../Debugger/Tabs/Logs/LogsDebugView.axaml.cs | 0 .../Debugger/Tabs/Logs/LogsDebugViewModel.cs | 0 .../PerformanceDebugMeasurementViewModel.cs | 0 .../PerformanceDebugPluginView.axaml | 0 .../PerformanceDebugPluginView.axaml.cs | 0 .../PerformanceDebugPluginViewModel.cs | 0 .../PerformanceDebugProfilerView.axaml | 0 .../PerformanceDebugProfilerView.axaml.cs | 0 .../PerformanceDebugProfilerViewModel.cs | 0 .../Performance/PerformanceDebugView.axaml | 0 .../Performance/PerformanceDebugView.axaml.cs | 0 .../Performance/PerformanceDebugViewModel.cs | 0 .../Tabs/Render/RenderDebugView.axaml | 0 .../Tabs/Render/RenderDebugView.axaml.cs | 0 .../Tabs/Render/RenderDebugViewModel.cs | 0 .../Tabs/Settings/DebugSettingsView.axaml | 0 .../Tabs/Settings/DebugSettingsView.axaml.cs | 0 .../Tabs/Settings/DebugSettingsViewModel.cs | 0 .../Device/DeviceDetectInputView.axaml | 0 .../Device/DeviceDetectInputView.axaml.cs | 0 .../Device/DeviceDetectInputViewModel.cs | 0 .../Screens/Device/DevicePropertiesView.axaml | 0 .../Device/DevicePropertiesView.axaml.cs | 0 .../Device/DevicePropertiesViewModel.cs | 0 .../Screens/Device/DeviceSettingsView.axaml | 0 .../Device/DeviceSettingsView.axaml.cs | 0 .../Screens/Device/DeviceSettingsViewModel.cs | 0 .../Device/Tabs/DeviceInfoTabView.axaml | 0 .../Device/Tabs/DeviceInfoTabView.axaml.cs | 0 .../Device/Tabs/DeviceInfoTabViewModel.cs | 0 .../Device/Tabs/DeviceLedsTabView.axaml | 0 .../Device/Tabs/DeviceLedsTabView.axaml.cs | 0 .../Device/Tabs/DeviceLedsTabViewModel.cs | 0 .../Device/Tabs/DevicePropertiesTabView.axaml | 0 .../Tabs/DevicePropertiesTabView.axaml.cs | 0 .../Tabs/DevicePropertiesTabViewModel.cs | 0 .../Device/Tabs/InputMappingsTabView.axaml | 0 .../Device/Tabs/InputMappingsTabView.axaml.cs | 0 .../Device/Tabs/InputMappingsTabViewModel.cs | 0 .../Screens/Header/SimpleHeaderView.xaml | 35 - .../Screens/Header/SimpleHeaderViewModel.cs | 69 - .../Artemis.UI/Screens/Home/HomeView.axaml | 0 .../Artemis.UI/Screens/Home/HomeView.axaml.cs | 0 src/Artemis.UI/Screens/Home/HomeView.xaml | 222 -- src/Artemis.UI/Screens/Home/HomeViewModel.cs | 10 +- src/Artemis.UI/Screens/IScreenViewModel.cs | 19 - .../Artemis.UI/Screens/MainScreenViewModel.cs | 0 ...uginPrerequisitesInstallDialogViewModel.cs | 0 ...inPrerequisitesUninstallDialogViewModel.cs | 0 .../Screens/Plugins/PluginFeatureView.axaml | 0 .../Plugins/PluginFeatureView.axaml.cs | 0 .../Screens/Plugins/PluginFeatureViewModel.cs | 0 .../Plugins/PluginPrerequisiteActionView.xaml | 26 - .../PluginPrerequisiteActionViewModel.cs | 10 +- .../Plugins/PluginPrerequisiteView.xaml | 37 - .../Plugins/PluginPrerequisiteViewModel.cs | 96 +- .../PluginPrerequisitesInstallDialogView.xaml | 139 -- ...uginPrerequisitesInstallDialogViewModel.cs | 152 -- ...luginPrerequisitesUninstallDialogView.xaml | 125 -- ...inPrerequisitesUninstallDialogViewModel.cs | 172 -- .../Screens/Plugins/PluginSettingsView.axaml | 0 .../Plugins/PluginSettingsView.axaml.cs | 0 .../Plugins/PluginSettingsViewModel.cs | 0 .../Plugins/PluginSettingsWindowView.axaml | 0 .../Plugins/PluginSettingsWindowView.axaml.cs | 0 .../Plugins/PluginSettingsWindowViewModel.cs | 0 .../Dialogs/LayerBrushPresetView.xaml | 42 - .../Dialogs/LayerBrushPresetViewModel.cs | 43 - .../ProfileEditor/Dialogs/RenameView.xaml | 32 - .../ProfileEditor/Dialogs/RenameView.xaml.cs | 24 - .../ProfileEditor/Dialogs/RenameViewModel.cs | 44 - .../DisplayConditionsView.xaml | 118 -- .../DisplayConditionsViewModel.cs | 114 - .../Event/EventConditionView.xaml | 204 -- .../Event/EventConditionViewModel.cs | 99 - .../Static/StaticConditionView.xaml | 175 -- .../Static/StaticConditionViewModel.cs | 60 - .../IProfileEditorPanelViewModel.cs | 8 - .../DataBindings/DataBindingsView.xaml | 54 - .../DataBindings/DataBindingsViewModel.cs | 88 - .../LayerEffects/EffectsView.xaml | 53 - .../LayerEffects/EffectsViewModel.cs | 78 - .../LayerProperties/LayerPropertiesView.xaml | 470 ----- .../LayerPropertiesView.xaml.cs | 29 - .../LayerPropertiesViewModel.cs | 682 ------ .../LayerPropertyGroupViewModel.cs | 183 -- .../LayerProperties/LayerPropertyViewModel.cs | 60 - .../Controls/PropertyTimelineHeader.cs | 191 -- .../Dialogs/TimelineSegmentDialogView.xaml | 42 - .../Dialogs/TimelineSegmentDialogViewModel.cs | 90 - .../Timeline/Models/KeyframeClipboardModel.cs | 86 - .../Timeline/TimelineEasingViewModel.cs | 51 - .../Timeline/TimelineGroupView.xaml | 77 - .../Timeline/TimelineGroupViewModel.cs | 73 - .../Timeline/TimelineKeyframeViewModel.cs | 206 -- .../Timeline/TimelinePropertyView.xaml | 117 -- .../Timeline/TimelinePropertyViewModel.cs | 122 -- .../Timeline/TimelineSegmentView.xaml | 169 -- .../Timeline/TimelineSegmentViewModel.cs | 404 ---- .../Timeline/TimelineView.xaml | 110 - .../Timeline/TimelineViewModel.cs | 453 ---- .../LayerProperties/Tree/TreeGroupView.xaml | 283 --- .../Tree/TreeGroupViewModel.cs | 209 -- .../Tree/TreePropertyView.xaml | 102 - .../Tree/TreePropertyViewModel.cs | 145 -- .../LayerProperties/Tree/TreeView.xaml | 29 - .../LayerProperties/Tree/TreeViewModel.cs | 36 - .../Panels/MenuBar/MenuBarView.axaml | 0 .../Panels/MenuBar/MenuBarView.axaml.cs | 0 .../Panels/MenuBar/MenuBarViewModel.cs | 0 .../Panels/Playback/PlaybackView.axaml | 0 .../Panels/Playback/PlaybackView.axaml.cs | 0 .../Panels/Playback/PlaybackViewModel.cs | 0 .../Behaviors/ProfileTreeViewDropHandler.cs | 0 .../ProfileTree/FolderTreeItemView.axaml | 0 .../ProfileTree/FolderTreeItemView.axaml.cs | 0 .../ProfileTree/FolderTreeItemViewModel.cs | 0 .../ProfileTree/LayerTreeItemView.axaml | 0 .../ProfileTree/LayerTreeItemView.axaml.cs | 0 .../ProfileTree/LayerTreeItemViewModel.cs | 0 .../Panels/ProfileTree/ProfileTreeView.axaml | 0 .../ProfileTree/ProfileTreeView.axaml.cs | 0 .../ProfileTree/ProfileTreeViewModel.cs | 0 .../Panels/ProfileTree/TreeItemViewModel.cs | 0 .../Panels/Properties/PropertiesView.axaml | 0 .../Panels/Properties/PropertiesView.axaml.cs | 0 .../Panels/Properties/PropertiesViewModel.cs | 0 .../Properties/PropertyGroupViewModel.cs | 0 .../Panels/Properties/PropertyViewModel.cs | 0 .../Timeline/ITimelinePropertyViewModel.cs | 0 .../Keyframes/ITimelineKeyframeViewModel.cs | 0 .../Keyframes/TimelineEasingView.axaml | 0 .../Keyframes/TimelineEasingView.axaml.cs | 0 .../Keyframes/TimelineEasingViewModel.cs | 0 .../Keyframes/TimelineKeyframeView.axaml | 0 .../Keyframes/TimelineKeyframeView.axaml.cs | 0 .../Keyframes/TimelineKeyframeViewModel.cs | 0 .../Timeline/Segments/EndSegmentView.axaml | 0 .../Timeline/Segments/EndSegmentView.axaml.cs | 0 .../Timeline/Segments/EndSegmentViewModel.cs | 0 .../Timeline/Segments/MainSegmentView.axaml | 0 .../Segments/MainSegmentView.axaml.cs | 0 .../Timeline/Segments/MainSegmentViewModel.cs | 0 .../Timeline/Segments/Segment.axaml | 0 .../Timeline/Segments/StartSegmentView.axaml | 0 .../Segments/StartSegmentView.axaml.cs | 0 .../Segments/StartSegmentViewModel.cs | 0 .../Segments/TimelineSegmentViewModel.cs | 0 .../Timeline/TimelineGroupView.axaml | 0 .../Timeline/TimelineGroupView.axaml.cs | 0 .../Timeline/TimelineGroupViewModel.cs | 0 .../Timeline/TimelinePropertyView.axaml | 0 .../Timeline/TimelinePropertyView.axaml.cs | 0 .../Timeline/TimelinePropertyViewModel.cs | 0 .../Properties/Timeline/TimelineView.axaml | 0 .../Properties/Timeline/TimelineView.axaml.cs | 0 .../Properties/Timeline/TimelineViewModel.cs | 0 .../Tree/Dialogs/LayerBrushPresetViewModel.cs | 0 .../Properties/Tree/ITreePropertyViewModel.cs | 0 .../Properties/Tree/TreeGroupView.axaml | 0 .../Properties/Tree/TreeGroupView.axaml.cs | 0 .../Properties/Tree/TreeGroupViewModel.cs | 0 .../Properties/Tree/TreePropertyView.axaml | 0 .../Properties/Tree/TreePropertyView.axaml.cs | 0 .../Properties/Tree/TreePropertyViewModel.cs | 0 .../BrushConfigurationWindowView.axaml | 0 .../BrushConfigurationWindowView.axaml.cs | 0 .../BrushConfigurationWindowViewModel.cs | 0 .../EffectConfigurationWindowView.axaml | 0 .../EffectConfigurationWindowView.axaml.cs | 0 .../EffectConfigurationWindowViewModel.cs | 0 .../Panels/StatusBar/StatusBarView.axaml | 0 .../Panels/StatusBar/StatusBarView.axaml.cs | 0 .../Panels/StatusBar/StatusBarViewModel.cs | 0 .../Tools/SelectionAddToolView.axaml | 0 .../Tools/SelectionAddToolView.axaml.cs | 0 .../Tools/SelectionAddToolViewModel.cs | 0 .../Tools/SelectionRemoveToolView.axaml | 0 .../Tools/SelectionRemoveToolView.axaml.cs | 0 .../Tools/SelectionRemoveToolViewModel.cs | 0 .../Tools/TransformToolView.axaml | 0 .../Tools/TransformToolView.axaml.cs | 0 .../Tools/TransformToolViewModel.cs | 0 .../VisualEditor/VisualEditorView.axaml | 0 .../VisualEditor/VisualEditorView.axaml.cs | 0 .../VisualEditor/VisualEditorViewModel.cs | 0 .../Visualizers/IVisualizerViewModel.cs | 0 .../LayerShapeVisualizerView.axaml | 0 .../LayerShapeVisualizerView.axaml.cs | 0 .../LayerShapeVisualizerViewModel.cs | 0 .../Visualizers/LayerVisualizerView.axaml | 0 .../Visualizers/LayerVisualizerView.axaml.cs | 0 .../Visualizers/LayerVisualizerViewModel.cs | 0 .../ProfileEditorTitleBarView.axaml | 0 .../ProfileEditorTitleBarView.axaml.cs | 0 .../ProfileEditorTitleBarViewModel.cs | 0 .../ProfileEditor/ProfileEditorView.axaml | 0 .../ProfileEditor/ProfileEditorView.axaml.cs | 0 .../ProfileEditor/ProfileEditorView.xaml | 257 --- .../ProfileEditor/ProfileEditorViewModel.cs | 396 +--- .../AdaptionHints/AdaptionHintViewModel.cs | 20 - .../CategoryAdaptionHintView.xaml | 78 - .../CategoryAdaptionHintViewModel.cs | 47 - .../AdaptionHints/DeviceAdaptionHintView.xaml | 79 - .../DeviceAdaptionHintViewModel.cs | 48 - .../KeyboardSectionAdaptionHintView.xaml | 53 - .../KeyboardSectionAdaptionHintViewModel.cs | 20 - .../Dialogs/LayerHintsDialogView.xaml | 125 -- .../Dialogs/LayerHintsDialogViewModel.cs | 127 -- .../ProfileTree/ProfileTreeView.xaml | 137 -- .../ProfileTree/ProfileTreeViewModel.cs | 268 --- .../ProfileTree/TreeItem/FolderView.xaml | 101 - .../ProfileTree/TreeItem/FolderViewModel.cs | 74 - .../ProfileTree/TreeItem/LayerView.xaml | 105 - .../ProfileTree/TreeItem/LayerViewModel.cs | 56 - .../ProfileTree/TreeItem/TreeItemViewModel.cs | 352 ---- .../SuspendedProfileEditorView.xaml | 23 - .../SuspendedProfileEditorViewModel.cs | 53 - .../Visualization/CanvasViewModel.cs | 22 - .../Visualization/ProfileLayerView.xaml | 40 - .../Visualization/ProfileLayerViewModel.cs | 228 -- .../Visualization/ProfileView.xaml | 161 -- .../Visualization/ProfileViewModel.cs | 448 ---- .../Visualization/Tools/EditToolView.xaml | 28 - .../Visualization/Tools/EditToolViewModel.cs | 469 ----- .../Tools/SelectionRemoveToolView.xaml | 45 - .../Tools/SelectionRemoveToolView.xaml.cs | 15 - .../Tools/SelectionRemoveToolViewModel.cs | 69 - .../Tools/SelectionToolView.xaml | 45 - .../Tools/SelectionToolView.xaml.cs | 15 - .../Tools/SelectionToolViewModel.cs | 104 - .../Tools/ViewpointMoveToolView.xaml | 9 - .../Tools/ViewpointMoveToolView.xaml.cs | 15 - .../Tools/ViewpointMoveToolViewModel.cs | 21 - .../Tools/VisualizationToolViewModel.cs | 91 - .../UserControls/LayerShapeControl.xaml | 117 -- .../UserControls/LayerShapeControl.xaml.cs | 393 ---- .../Windows/LayerBrushSettingsWindowView.xaml | 36 - .../LayerBrushSettingsWindowViewModel.cs | 46 - .../LayerEffectSettingsWindowView.xaml | 33 - .../LayerEffectSettingsWindowViewModel.cs | 46 - .../Windows/NodeScriptWindowView.xaml | 36 - .../Windows/NodeScriptWindowViewModel.cs | 20 - .../Screens/Root/DefaultTitleBarView.axaml | 0 .../Screens/Root/DefaultTitleBarView.axaml.cs | 0 .../Screens/Root/DefaultTitleBarViewModel.cs | 0 .../Artemis.UI/Screens/Root/RootView.axaml | 0 .../Artemis.UI/Screens/Root/RootView.axaml.cs | 0 .../Artemis.UI/Screens/Root/RootViewModel.cs | 0 .../Artemis.UI/Screens/Root/SplashView.axaml | 0 .../Screens/Root/SplashView.axaml.cs | 0 .../Screens/Root/SplashViewModel.cs | 0 src/Artemis.UI/Screens/RootView.xaml | 86 - src/Artemis.UI/Screens/RootViewModel.cs | 220 -- .../ScriptConfigurationCreateView.xaml | 61 - .../ScriptConfigurationCreateViewModel.cs | 57 - .../Dialogs/ScriptConfigurationEditView.xaml | 46 - .../ScriptConfigurationEditViewModel.cs | 53 - .../Scripting/ScriptConfigurationViewModel.cs | 27 - .../Screens/Scripting/ScriptsDialogView.xaml | 153 -- .../Scripting/ScriptsDialogViewModel.cs | 173 -- .../Screens/Settings/Debug/DebugView.xaml | 83 - .../Screens/Settings/Debug/DebugViewModel.cs | 71 - .../Debug/Tabs/DataModelDebugView.xaml | 178 -- .../Debug/Tabs/DataModelDebugViewModel.cs | 166 -- .../Settings/Debug/Tabs/LogsDebugView.xaml | 47 - .../Settings/Debug/Tabs/LogsDebugView.xaml.cs | 15 - .../Settings/Debug/Tabs/LogsDebugViewModel.cs | 127 -- .../PerformanceDebugMeasurementViewModel.cs | 60 - .../PerformanceDebugPluginView.xaml | 33 - .../PerformanceDebugPluginViewModel.cs | 28 - .../PerformanceDebugProfilerView.xaml | 34 - .../PerformanceDebugProfilerViewModel.cs | 30 - .../Performance/PerformanceDebugView.xaml | 35 - .../Performance/PerformanceDebugView.xaml.cs | 35 - .../Performance/PerformanceDebugViewModel.cs | 77 - .../Settings/Debug/Tabs/RenderDebugView.xaml | 50 - .../Debug/Tabs/RenderDebugViewModel.cs | 154 -- .../Settings/Device/DeviceDialogView.xaml | 160 -- .../Settings/Device/DeviceDialogViewModel.cs | 261 --- .../Device/DeviceLayoutDialogView.xaml | 187 -- .../Device/DeviceLayoutDialogViewModel.cs | 128 -- .../Device/Tabs/DeviceInfoTabView.xaml | 132 -- .../Device/Tabs/DeviceInfoTabViewModel.cs | 39 - .../Device/Tabs/DeviceLedsTabView.xaml | 44 - .../Device/Tabs/DeviceLedsTabViewModel.cs | 90 - .../Device/Tabs/DevicePropertiesTabView.xaml | 270 --- .../Tabs/DevicePropertiesTabViewModel.cs | 278 --- .../Device/Tabs/InputMappingsTabView.xaml | 83 - .../Device/Tabs/InputMappingsTabViewModel.cs | 103 - .../SurfaceDeviceConfigViewModelValidator.cs | 19 - .../Settings/Dialogs/UpdateDialogView.xaml | 67 - .../Settings/Dialogs/UpdateDialogViewModel.cs | 128 -- .../Screens/Settings/SettingsTabsView.xaml | 47 - .../Screens/Settings/SettingsTabsViewModel.cs | 37 - .../Screens/Settings/SettingsView.axaml | 0 .../Screens/Settings/SettingsView.axaml.cs | 0 .../Screens/Settings/SettingsView.xaml | 12 - .../Screens/Settings/SettingsViewModel.cs | 23 +- .../Settings/Tabs/About/AboutTabView.xaml | 436 ---- .../Settings/Tabs/About/AboutTabViewModel.cs | 46 - .../Screens/Settings/Tabs/AboutTabView.axaml | 0 .../Settings/Tabs/AboutTabView.axaml.cs | 0 .../Settings/Tabs/AboutTabViewModel.cs | 0 .../Tabs/Devices/DeviceSettingsTabView.xaml | 35 - .../Devices/DeviceSettingsTabViewModel.cs | 88 - .../Tabs/Devices/DeviceSettingsView.xaml | 86 - .../Tabs/Devices/DeviceSettingsViewModel.cs | 107 - .../Settings/Tabs/DevicesTabView.axaml | 0 .../Settings/Tabs/DevicesTabView.axaml.cs | 0 .../Settings/Tabs/DevicesTabViewModel.cs | 0 .../Tabs/General/GeneralSettingsTabView.xaml | 497 ----- .../General/GeneralSettingsTabViewModel.cs | 264 --- .../Settings/Tabs/GeneralTabView.axaml | 0 .../Settings/Tabs/GeneralTabView.axaml.cs | 0 .../Settings/Tabs/GeneralTabViewModel.cs | 0 .../Tabs/Plugins/PluginFeatureView.xaml | 105 - .../Tabs/Plugins/PluginFeatureViewModel.cs | 200 -- .../Tabs/Plugins/PluginSettingsTabView.xaml | 91 - .../Plugins/PluginSettingsTabViewModel.cs | 119 -- .../Tabs/Plugins/PluginSettingsView.xaml | 209 -- .../Tabs/Plugins/PluginSettingsView.xaml.cs | 15 - .../Tabs/Plugins/PluginSettingsViewModel.cs | 325 --- .../Plugins/PluginSettingsWindowView.xaml | 43 - .../Plugins/PluginSettingsWindowViewModel.cs | 34 - .../Settings/Tabs/PluginsTabView.axaml | 0 .../Settings/Tabs/PluginsTabView.axaml.cs | 0 .../Settings/Tabs/PluginsTabViewModel.cs | 0 .../Screens/Shared/PanZoomViewModel.cs | 196 -- .../Screens/Sidebar/ArtemisSidebar.xaml | 127 -- .../SidebarCategoryEditView.axaml | 0 .../SidebarCategoryEditView.axaml.cs | 0 .../SidebarCategoryEditViewModel.cs | 0 .../ProfileConfigurationEditView.axaml | 0 .../ProfileConfigurationEditView.axaml.cs | 0 .../ProfileConfigurationEditViewModel.cs | 0 .../ModuleActivationRequirementView.xaml | 48 - .../ModuleActivationRequirementViewModel.cs | 75 - .../ModuleActivationRequirementsView.xaml | 27 - .../ModuleActivationRequirementsViewModel.cs | 43 - .../ProfileConfigurationHotkeyView.xaml | 20 - .../ProfileConfigurationHotkeyViewModel.cs | 84 - .../Dialogs/ProfileEdit/ProfileEditView.xaml | 318 --- .../ProfileEdit/ProfileEditViewModel.cs | 246 --- .../ProfileEdit/ProfileIconViewModel.cs | 16 - .../ProfileEdit/ProfileModuleViewModel.cs | 24 - .../Sidebar/Dialogs/ProfileIconViewModel.cs | 0 .../Sidebar/Dialogs/ProfileModuleViewModel.cs | 0 .../Dialogs/SidebarCategoryCreateView.xaml | 30 - .../Dialogs/SidebarCategoryCreateViewModel.cs | 56 - .../Dialogs/SidebarCategoryUpdateView.xaml | 44 - .../Dialogs/SidebarCategoryUpdateViewModel.cs | 73 - .../Screens/Sidebar/SidebarCategoryView.axaml | 0 .../Sidebar/SidebarCategoryView.axaml.cs | 0 .../Screens/Sidebar/SidebarCategoryView.xaml | 213 -- .../Sidebar/SidebarCategoryView.xaml.cs | 21 - .../Sidebar/SidebarCategoryViewModel.cs | 285 +-- .../SidebarProfileConfigurationView.axaml | 0 .../SidebarProfileConfigurationView.axaml.cs | 0 .../SidebarProfileConfigurationView.xaml | 235 --- .../SidebarProfileConfigurationViewModel.cs | 164 +- .../Screens/Sidebar/SidebarScreenView.axaml | 0 .../Sidebar/SidebarScreenView.axaml.cs | 0 .../Screens/Sidebar/SidebarScreenView.xaml | 15 - .../Screens/Sidebar/SidebarScreenViewModel.cs | 24 +- .../Screens/Sidebar/SidebarView.axaml | 0 .../Screens/Sidebar/SidebarView.axaml.cs | 0 .../Screens/Sidebar/SidebarView.xaml | 168 -- .../Screens/Sidebar/SidebarViewModel.cs | 314 +-- src/Artemis.UI/Screens/Splash/SplashView.xaml | 34 - .../Screens/Splash/SplashViewModel.cs | 105 - .../StartupWizard/StartupWizardView.xaml | 76 - .../StartupWizard/StartupWizardViewModel.cs | 69 - .../StartupWizard/Steps/DevicesStepView.xaml | 37 - .../Steps/DevicesStepViewModel.cs | 41 - .../StartupWizard/Steps/FinishStepView.xaml | 65 - .../Steps/FinishStepViewModel.cs | 18 - .../StartupWizard/Steps/LayoutStepView.xaml | 72 - .../Steps/LayoutStepViewModel.cs | 47 - .../StartupWizard/Steps/SettingsStepView.xaml | 85 - .../Steps/SettingsStepViewModel.cs | 97 - .../StartupWizard/Steps/WelcomeStepView.xaml | 30 - .../Steps/WelcomeStepViewModel.cs | 11 - .../Dialogs/SurfaceDeviceDetectInputView.xaml | 61 - .../SurfaceDeviceDetectInputViewModel.cs | 55 - .../SurfaceEditor/ListDeviceView.axaml | 0 .../SurfaceEditor/ListDeviceView.axaml.cs | 0 .../SurfaceEditor/ListDeviceViewModel.cs | 0 .../SurfaceEditor/SurfaceDeviceView.axaml | 0 .../SurfaceEditor/SurfaceDeviceView.axaml.cs | 0 .../SurfaceEditor/SurfaceDeviceViewModel.cs | 0 .../SurfaceEditor/SurfaceEditorView.axaml | 0 .../SurfaceEditor/SurfaceEditorView.axaml.cs | 0 .../SurfaceEditor/SurfaceEditorView.xaml | 335 --- .../SurfaceEditor/SurfaceEditorViewModel.cs | 447 +--- .../Visualization/ListDeviceView.xaml | 38 - .../Visualization/ListDeviceViewModel.cs | 33 - .../Visualization/SurfaceDeviceView.xaml | 106 - .../Visualization/SurfaceDeviceViewModel.cs | 138 -- src/Artemis.UI/Screens/TrayView.xaml | 58 - src/Artemis.UI/Screens/TrayViewModel.cs | 234 --- .../Screens/VisualScripting/CableView.axaml | 0 .../VisualScripting/CableView.axaml.cs | 0 .../Screens/VisualScripting/CableViewModel.cs | 0 .../VisualScripting/DragCableView.axaml | 0 .../VisualScripting/DragCableView.axaml.cs | 0 .../VisualScripting/DragCableViewModel.cs | 0 .../VisualScripting/NodePickerView.axaml | 0 .../VisualScripting/NodePickerView.axaml.cs | 0 .../VisualScripting/NodePickerViewModel.cs | 0 .../VisualScripting/NodeScriptView.axaml | 0 .../VisualScripting/NodeScriptView.axaml.cs | 0 .../VisualScripting/NodeScriptViewModel.cs | 0 .../Screens/VisualScripting/NodeView.axaml | 0 .../Screens/VisualScripting/NodeView.axaml.cs | 0 .../Screens/VisualScripting/NodeViewModel.cs | 0 .../Pins/InputPinCollectionView.axaml | 0 .../Pins/InputPinCollectionView.axaml.cs | 0 .../Pins/InputPinCollectionViewModel.cs | 0 .../VisualScripting/Pins/InputPinView.axaml | 0 .../Pins/InputPinView.axaml.cs | 0 .../VisualScripting/Pins/InputPinViewModel.cs | 0 .../Pins/OutputPinCollectionView.axaml | 0 .../Pins/OutputPinCollectionView.axaml.cs | 0 .../Pins/OutputPinCollectionViewModel.cs | 0 .../VisualScripting/Pins/OutputPinView.axaml | 0 .../Pins/OutputPinView.axaml.cs | 0 .../Pins/OutputPinViewModel.cs | 0 .../Pins/PinCollectionViewModel.cs | 0 .../Screens/VisualScripting/Pins/PinView.cs | 0 .../VisualScripting/Pins/PinViewModel.cs | 0 .../VisualScripting/VisualScripting.axaml | 0 .../Screens/Workshop/WorkshopView.axaml | 0 .../Screens/Workshop/WorkshopView.axaml.cs | 0 .../Screens/Workshop/WorkshopView.xaml | 26 - .../Screens/Workshop/WorkshopViewModel.cs | 89 +- src/Artemis.UI/Services/DebugService.cs | 66 +- .../Services/DeviceLayoutService.cs | 93 - .../Services/Interfaces/IArtemisUIService.cs | 3 +- .../Services/Interfaces/IDebugService.cs | 3 +- .../Interfaces/ILayerEditorService.cs | 55 - .../Interfaces/IRegistrationService.cs | 0 .../Services/Interfaces/IThemeService.cs | 19 - src/Artemis.UI/Services/LayerEditorService.cs | 130 -- .../Models/UpdateService/DevOpsBuilds.cs | 277 --- .../Models/UpdateService/GitHubDifference.cs | 243 --- .../Services/RegistrationService.cs | 260 +-- src/Artemis.UI/Services/ThemeService.cs | 186 -- src/Artemis.UI/Services/UpdateService.cs | 250 --- src/Artemis.UI/SkiaSharp/Vulkan/Kernel32.cs | 24 - src/Artemis.UI/SkiaSharp/Vulkan/VkContext.cs | 35 - .../SkiaSharp/Vulkan/Win32VkContext.cs | 86 - src/Artemis.UI/SkiaSharp/VulkanContext.cs | 64 - .../Artemis.UI/Styles/Artemis.axaml | 0 src/Artemis.UI/Stylet/ArtemisViewManager.cs | 17 - .../Stylet/FluentValidationAdapter.cs | 41 - src/Artemis.UI/Stylet/NinjectBootstrapper.cs | 68 - src/Artemis.UI/Utilities/BindingProxy.cs | 26 - src/Artemis.UI/Utilities/DPIAwareness.cs | 36 - src/Artemis.UI/Utilities/ProcessUtilities.cs | 235 --- src/Artemis.UI/Utilities/SettingsUtilities.cs | 95 - src/Artemis.UI/Utilities/WindowState.cs | 33 - src/Artemis.UI/Utilities/WindowUtilities.cs | 23 - src/{Avalonia => }/Artemis.UI/ViewLocator.cs | 0 src/Artemis.UI/packages.lock.json | 710 +++++-- .../Artemis.VisualScripting.csproj | 73 +- .../Behaviors/HighlightTermBehavior.cs | 169 -- .../Converters/CenterTranslateConverter.cs | 25 - .../Converters/NumericConverter.cs | 0 .../Controls/VisualScriptCablePresenter.cs | 177 -- .../Editor/Controls/VisualScriptEditor.cs | 41 - .../Controls/VisualScriptNodeCreationBox.cs | 166 -- .../Controls/VisualScriptNodePresenter.cs | 198 -- .../Controls/VisualScriptPinPresenter.cs | 199 -- .../Editor/Controls/VisualScriptPresenter.cs | 624 ------ .../Editor/Controls/Wrapper/VisualScript.cs | 298 --- .../Controls/Wrapper/VisualScriptCable.cs | 73 - .../Controls/Wrapper/VisualScriptNode.cs | 290 --- .../Controls/Wrapper/VisualScriptPin.cs | 148 -- .../Wrapper/VisualScriptPinCollection.cs | 86 - .../Editor/EditorStyles.xaml | 10 - .../Styles/VisualScriptCablePresenter.xaml | 110 - .../Editor/Styles/VisualScriptEditor.xaml | 29 - .../Styles/VisualScriptNodeCreationBox.xaml | 92 - .../Styles/VisualScriptNodePresenter.xaml | 261 --- .../Styles/VisualScriptPinPresenter.xaml | 87 - .../Editor/Styles/VisualScriptPresenter.xaml | 119 -- .../Events/NodeAddedEventManager.cs | 77 - .../Events/NodeRemovedEventManager.cs | 77 - .../Events/PinAddedEventManager.cs | 77 - .../Events/PinConnectedEventArgs.cs | 25 - .../Events/PinConnectedEventManager.cs | 77 - .../Events/PinDisconnectedEventArgs.cs | 25 - .../Events/PinDisconnectedEventManager.cs | 77 - .../Events/PinRemovedEventManager.cs | 77 - .../VisualScriptNodeDragMovingEventArgs.cs | 24 - ...ualScriptNodeIsSelectedChangedEventArgs.cs | 24 - .../Internal/IsConnectingPin.cs | 27 - .../Nodes/BoolOperations.cs | 513 +++-- .../Nodes/Color/BrightenSKColorNode.cs | 35 +- .../StaticSKColorValueNodeCustomViewModel.cs | 12 +- .../StaticSKColorValueNodeCustomView.xaml | 9 +- .../Nodes/Color/DarkenSKColorNode.cs | 35 +- .../Nodes/Color/DesaturateSKColorNode.cs | 38 +- .../Nodes/Color/HslSKColorNode.cs | 49 +- .../Nodes/Color/InvertSKColorNode.cs | 37 +- .../Nodes/Color/RotateHueSkColorNode.cs | 35 +- .../Nodes/Color/SaturateSkColorNode.cs | 38 +- .../Nodes/Color/StaticSKColorValueNode.cs | 53 +- .../Nodes/Color/SumSKColorsNode.cs | 77 +- .../Nodes/ConvertNodes.cs | 143 +- .../CustomViewModels/CustomNodeViewModel.cs | 58 - .../EnumEqualsNodeCustomViewModel.cs | 76 +- .../LayerPropertyNodeCustomViewModel.cs | 141 +- .../StaticValueNodeViewModels.cs | 47 +- .../CustomViews/EnumEqualsNodeCustomView.xaml | 26 - .../LayerPropertyNodeCustomView.xaml | 18 - .../StaticNumericValueNodeCustomView.axaml | 0 .../StaticNumericValueNodeCustomView.axaml.cs | 0 .../StaticNumericValueNodeCustomView.xaml | 15 - .../StaticStringValueNodeCustomView.axaml | 0 .../StaticStringValueNodeCustomView.axaml.cs | 0 .../StaticStringValueNodeCustomView.xaml | 12 - .../DataModelEventNodeCustomViewModel.cs | 128 +- .../DataModelNodeCustomViewModel.cs | 126 +- .../DataModelEventNodeCustomView.axaml | 0 .../DataModelEventNodeCustomView.axaml.cs | 0 .../DataModelEventNodeCustomView.xaml | 21 - .../CustomViews/DataModelNodeCustomView.axaml | 0 .../DataModelNodeCustomView.axaml.cs | 0 .../CustomViews/DataModelNodeCustomView.xaml | 16 - .../Nodes/DataModel/DataModelEventNode.cs | 294 ++- .../Nodes/DataModel/DataModelNode.cs | 153 +- .../EasingTypeNodeCustomViewModel.cs | 94 +- .../CustomViewModels/NodeEasingViewModel.cs | 40 +- .../EasingTypeNodeCustomView.axaml | 0 .../EasingTypeNodeCustomView.axaml.cs | 0 .../CustomViews/EasingTypeNodeCustomView.xaml | 35 - .../Nodes/Easing/EasingTypeNode.cs | 23 +- .../Nodes/Easing/NumericEasingNode.cs | 106 +- .../Nodes/Easing/SKColorEasingNode.cs | 104 +- .../Nodes/LayerPropertyNode.cs | 222 +- .../MathExpressionNodeCustomViewModel.cs | 11 +- .../MathExpressionNodeCustomView.xaml | 9 +- .../Nodes/Maths/ExpressionNode.cs | 209 +- .../Nodes/Maths/RoundNode.cs | 44 +- .../Nodes/StaticValueNodes.cs | 105 +- .../Nodes/StringFormatNode.cs | 68 +- src/Artemis.VisualScripting/Nodes/SumNode.cs | 59 +- .../Properties/DesignTimeResources.xaml | 8 - .../DataModelConditions.xaml | 108 - .../ViewModel/AbstractBindable.cs | 64 - .../ViewModel/ActionCommand.cs | 77 - .../packages.lock.json | 524 ++++- src/Artemis.sln | 122 +- src/Artemis.sln.bak | 99 + .../Artemis.UI.Shared.csproj | 49 - .../Artemis.UI.Shared.csproj.DotSettings | 6 - .../Controls/DeviceVisualizer.cs | 314 --- .../Controls/DeviceVisualizerLed.cs | 158 -- .../ColorGradientToGradientStopsConverter.cs | 41 - .../Converters/ColorToSKColorConverter.cs | 38 - .../Converters/SKColorToStringConverter.cs | 28 - .../Converters/TypeToStringConverter.cs | 29 - .../DataModelDisplayViewModel.cs | 73 - .../DataModelInputViewModel.cs | 114 - .../DataModelVisualizationRegistration.cs | 89 - .../Shared/DataModelEventViewModel.cs | 71 - .../Shared/DataModelListViewModel.cs | 137 -- .../Shared/DataModelPropertiesViewModel.cs | 83 - .../Shared/DataModelPropertyViewModel.cs | 83 - .../Shared/DataModelUpdateConfiguration.cs | 22 - .../Shared/DataModelVisualizationViewModel.cs | 401 ---- .../Display/DefaultDataModelDisplayView.xaml | 47 - .../DefaultDataModelDisplayViewModel.cs | 44 - .../Events/DataModelSelectedEventArgs.cs | 22 - .../Events/LedClickedEventArgs.cs | 27 - .../Events/ProfileConfigurationEventArgs.cs | 32 - .../Events/RenderProfileElementEventArgs.cs | 32 - .../Exceptions/ArtemisUIException.cs | 22 - .../Ninject/SharedUIModule.cs | 31 - .../BrushConfigurationViewModel.cs | 57 - .../LayerBrushConfigurationDialog.cs | 45 - .../EffectConfigurationViewModel.cs | 57 - .../LayerEffectConfigurationDialog.cs | 46 - .../Plugins/PluginConfigurationDialog.cs | 21 - .../Plugins/PluginConfigurationViewModel.cs | 46 - .../ScriptEditorViewModel.cs | 56 - .../Services/DataModelUIService.cs | 252 --- .../Interfaces/IArtemisSharedUIService.cs | 9 - .../Interfaces/IDataModelUIService.cs | 108 - .../Services/Window/WindowService.cs | 148 -- src/Avalonia/Artemis.UI/Artemis.UI.csproj | 76 - .../Assets/Images/Logo/bow-black.ico | Bin 67917 -> 0 bytes .../Assets/Images/Logo/bow-white.ico | Bin 20740 -> 0 bytes .../Assets/Images/Logo/bow-white.svg | 12 - .../Artemis.UI/Assets/Images/Logo/bow.ico | Bin 47090 -> 0 bytes .../Artemis.UI/Assets/Images/Logo/bow.svg | 43 - .../ColorToSolidColorBrushConverter.cs | 25 - .../Converters/LedIdToStringConverter.cs | 28 - .../NormalizedPercentageConverter.cs | 29 - .../Converters/UriToFileNameConverter.cs | 22 - .../Converters/ValuesAdditionConverter.cs | 19 - .../BoolPropertyInputViewModel.cs | 31 - .../BrushPropertyInputViewModel.cs | 92 - .../ColorGradientPropertyInputViewModel.cs | 87 - .../EnumPropertyInputViewModel.cs | 17 - .../FloatPropertyInputViewModel.cs | 20 - .../FloatRangePropertyInputViewModel.cs | 68 - .../IntPropertyInputViewModel.cs | 20 - .../IntRangePropertyInputViewModel.cs | 68 - .../SKColorPropertyInputViewModel.cs | 17 - .../SKPointPropertyInputViewModel.cs | 50 - .../SKSizePropertyInputViewModel.cs | 52 - .../ArtemisGraphicsContextException.cs | 22 - .../Exceptions/ArtemisUIException.cs | 19 - .../BindableCollectionExtensions.cs | 21 - .../Ninject/Factories/IVMFactory.cs | 105 - .../LayerPropertyViewModelInstanceProvider.cs | 32 - src/Avalonia/Artemis.UI/Ninject/UIModule.cs | 74 - .../Artemis.UI/Screens/Home/HomeViewModel.cs | 12 - .../PluginPrerequisiteActionViewModel.cs | 15 - .../Plugins/PluginPrerequisiteViewModel.cs | 129 -- .../ProfileEditor/ProfileEditorViewModel.cs | 77 - .../Screens/Settings/SettingsViewModel.cs | 26 - .../Sidebar/SidebarCategoryViewModel.cs | 123 -- .../SidebarProfileConfigurationViewModel.cs | 64 - .../Screens/Sidebar/SidebarScreenViewModel.cs | 37 - .../Screens/Sidebar/SidebarViewModel.cs | 134 -- .../SurfaceEditor/SurfaceEditorViewModel.cs | 208 -- .../Screens/Workshop/WorkshopViewModel.cs | 95 - .../Artemis.UI/Services/DebugService.cs | 41 - .../Services/Interfaces/IArtemisUIService.cs | 6 - .../Services/Interfaces/IDebugService.cs | 8 - .../Services/RegistrationService.cs | 99 - .../Artemis.VisualScripting.csproj | 84 - .../Ninject/NoStringNinjectModule.cs | 52 - .../Nodes/BoolOperations.cs | 299 --- .../Nodes/Color/BrightenSKColorNode.cs | 26 - .../StaticSKColorValueNodeCustomViewModel.cs | 11 - .../StaticSKColorValueNodeCustomView.xaml | 15 - .../Nodes/Color/DarkenSKColorNode.cs | 26 - .../Nodes/Color/DesaturateSKColorNode.cs | 26 - .../Nodes/Color/HslSKColorNode.cs | 31 - .../Nodes/Color/InvertSKColorNode.cs | 27 - .../Nodes/Color/RotateHueSkColorNode.cs | 26 - .../Nodes/Color/SaturateSkColorNode.cs | 26 - .../Nodes/Color/StaticSKColorValueNode.cs | 34 - .../Nodes/Color/SumSKColorsNode.cs | 45 - .../Nodes/ConvertNodes.cs | 80 - .../EnumEqualsNodeCustomViewModel.cs | 49 - .../LayerPropertyNodeCustomViewModel.cs | 73 - .../StaticValueNodeViewModels.cs | 47 - .../DataModelEventNodeCustomViewModel.cs | 105 - .../DataModelNodeCustomViewModel.cs | 104 - .../Nodes/DataModel/DataModelEventNode.cs | 151 -- .../Nodes/DataModel/DataModelNode.cs | 82 - .../EasingTypeNodeCustomViewModel.cs | 54 - .../CustomViewModels/NodeEasingViewModel.cs | 27 - .../Nodes/Easing/EasingTypeNode.cs | 20 - .../Nodes/Easing/NumericEasingNode.cs | 66 - .../Nodes/Easing/SKColorEasingNode.cs | 65 - .../Nodes/LayerPropertyNode.cs | 124 -- .../MathExpressionNodeCustomViewModel.cs | 11 - .../MathExpressionNodeCustomView.xaml | 11 - .../Nodes/Maths/ExpressionNode.cs | 116 -- .../Nodes/Maths/RoundNode.cs | 26 - .../Nodes/StaticValueNodes.cs | 62 - .../Nodes/StringFormatNode.cs | 37 - .../Artemis.VisualScripting/Nodes/SumNode.cs | 35 - 1110 files changed, 10872 insertions(+), 52240 deletions(-) rename src/{Avalonia => }/Artemis.UI.Linux/.gitignore (100%) rename src/{Avalonia => }/Artemis.UI.Linux/App.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Linux/App.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI.Linux/ApplicationStateManager.cs (100%) rename src/{Avalonia => }/Artemis.UI.Linux/Artemis.UI.Linux.csproj (90%) rename src/{Avalonia => }/Artemis.UI.Linux/Assets/avalonia-logo.ico (100%) rename src/{Avalonia => }/Artemis.UI.Linux/Program.cs (100%) rename src/{Avalonia => }/Artemis.UI.Linux/Providers/Input/LinuxAbsoluteAxis.cs (100%) rename src/{Avalonia => }/Artemis.UI.Linux/Providers/Input/LinuxInputDevice.cs (100%) rename src/{Avalonia => }/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceFinder.cs (100%) rename src/{Avalonia => }/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceReader.cs (100%) rename src/{Avalonia => }/Artemis.UI.Linux/Providers/Input/LinuxInputEventArgs.cs (100%) rename src/{Avalonia => }/Artemis.UI.Linux/Providers/Input/LinuxInputEventType.cs (100%) rename src/{Avalonia => }/Artemis.UI.Linux/Providers/Input/LinuxInputProvider.cs (100%) rename src/{Avalonia => }/Artemis.UI.Linux/Providers/Input/LinuxKeyboardKeyCodes.cs (100%) rename src/{Avalonia => }/Artemis.UI.Linux/Providers/Input/LinuxRelativeAxis.cs (100%) rename src/{Avalonia => }/Artemis.UI.Linux/Utilities/InputUtilities.cs (100%) create mode 100644 src/Artemis.UI.Linux/packages.lock.json rename src/{Avalonia => }/Artemis.UI.MacOS/.gitignore (100%) rename src/{Avalonia => }/Artemis.UI.MacOS/App.axaml (100%) rename src/{Avalonia => }/Artemis.UI.MacOS/App.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI.MacOS/Artemis.UI.MacOS.csproj (90%) rename src/{Avalonia => }/Artemis.UI.MacOS/Assets/avalonia-logo.ico (100%) rename src/{Avalonia => }/Artemis.UI.MacOS/Program.cs (100%) create mode 100644 src/Artemis.UI.MacOS/packages.lock.json rename src/{Avalonia => }/Artemis.UI.Shared/Artemis.UI.Avalonia.Shared.csproj.DotSettings (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Artemis.UI.Avalonia.Shared.xml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/AttachedProperties/NumberBoxAssist.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/AttachedProperties/TextBoxAssist.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Behaviors/LostFocusNumberBoxBindingBehavior.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Behaviors/LostFocusTextBoxBindingBehavior.cs (100%) delete mode 100644 src/Artemis.UI.Shared/Behaviors/OpenInBrowser.cs delete mode 100644 src/Artemis.UI.Shared/Behaviors/PutCursorAtEndTextBoxBehavior.cs delete mode 100644 src/Artemis.UI.Shared/Behaviors/ScrollParentWhenAtMax.cs delete mode 100644 src/Artemis.UI.Shared/Bootstrapper.cs rename src/{Avalonia => }/Artemis.UI.Shared/Controls/ArtemisIcon.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Controls/ArtemisIcon.axaml.cs (100%) delete mode 100644 src/Artemis.UI.Shared/Controls/ArtemisIcon.xaml delete mode 100644 src/Artemis.UI.Shared/Controls/ArtemisIcon.xaml.cs delete mode 100644 src/Artemis.UI.Shared/Controls/ColorPicker.xaml delete mode 100644 src/Artemis.UI.Shared/Controls/ColorPicker.xaml.cs delete mode 100644 src/Artemis.UI.Shared/Controls/DataModelPicker.xaml delete mode 100644 src/Artemis.UI.Shared/Controls/DataModelPicker.xaml.cs rename src/{Avalonia => }/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPicker.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPickerButton.cs (100%) delete mode 100644 src/Artemis.UI.Shared/Controls/DraggableFloat.xaml delete mode 100644 src/Artemis.UI.Shared/Controls/DraggableFloat.xaml.cs rename src/{Avalonia => }/Artemis.UI.Shared/Controls/EnumComboBox.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Controls/EnumComboBox.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Controls/Flyouts/DataModelPickerFlyout.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Controls/Flyouts/GradientPickerFlyout.cs (100%) delete mode 100644 src/Artemis.UI.Shared/Controls/GradientPicker.xaml delete mode 100644 src/Artemis.UI.Shared/Controls/GradientPicker.xaml.cs rename src/{Avalonia => }/Artemis.UI.Shared/Controls/GradientPicker/GradientPicker.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Controls/GradientPicker/GradientPickerButton.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Controls/GradientPicker/GradientPickerColorStop.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Controls/HotkeyBox.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Controls/HotkeyBox.axaml.cs (100%) delete mode 100644 src/Artemis.UI.Shared/Controls/LockableToggleButton.cs rename src/{Avalonia => }/Artemis.UI.Shared/Controls/NoInputTextBox.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml.cs (100%) delete mode 100644 src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.xaml delete mode 100644 src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.xaml.cs rename src/{Avalonia => }/Artemis.UI.Shared/Controls/SelectionRectangle.cs (100%) delete mode 100644 src/Artemis.UI.Shared/Converters/ColorToSolidColorConverter.cs delete mode 100644 src/Artemis.UI.Shared/Converters/ColorToStringConverter.cs rename src/{Avalonia => }/Artemis.UI.Shared/Converters/EnumToBooleanConverter.cs (100%) delete mode 100644 src/Artemis.UI.Shared/Converters/IntToVisibilityConverter.cs delete mode 100644 src/Artemis.UI.Shared/Converters/NullToVisibilityConverter.cs rename src/{Avalonia => }/Artemis.UI.Shared/Converters/ParentWidthPercentageConverter.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Converters/SKColorToBrushConverter.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Converters/SKColorToColorConverter.cs (100%) delete mode 100644 src/Artemis.UI.Shared/Converters/StreamToBitmapImageConverter.cs delete mode 100644 src/Artemis.UI.Shared/Converters/StreamToSvgImageConverter.cs delete mode 100644 src/Artemis.UI.Shared/Converters/StringToNumericConverter.cs rename src/{Avalonia => }/Artemis.UI.Shared/Converters/WidthNormalizedConverter.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListItemViewModel.cs (100%) delete mode 100644 src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListPropertiesViewModel.cs delete mode 100644 src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListPropertyViewModel.cs rename src/{Avalonia => }/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.axaml.cs (100%) delete mode 100644 src/Artemis.UI.Shared/DependencyProperties/SizeObserver.cs rename src/{Avalonia => }/Artemis.UI.Shared/Events/DialogClosedEventArgs.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Events/SelectionRectangleEventArgs.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Extensions/ControlExtensions.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Extensions/LayerExtensions.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Extensions/PointExtensions.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Extensions/SKColorExtensions.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Extensions/SKMatrixExtensions.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Extensions/SKRectExtensions.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Extensions/TypeExtensions.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Extensions/VisualExtensions.cs (100%) delete mode 100644 src/Artemis.UI.Shared/Ninject/Factories/ISharedVMFactory.cs delete mode 100644 src/Artemis.UI.Shared/Plugins/Modules/ModuleViewModel.cs delete mode 100644 src/Artemis.UI.Shared/Properties/Annotations.cs delete mode 100644 src/Artemis.UI.Shared/Properties/AssemblyInfo.cs delete mode 100644 src/Artemis.UI.Shared/Properties/DesignTimeResources.xaml delete mode 100644 src/Artemis.UI.Shared/Properties/Resources.Designer.cs delete mode 100644 src/Artemis.UI.Shared/Properties/Resources.resx delete mode 100644 src/Artemis.UI.Shared/Properties/Settings.Designer.cs delete mode 100644 src/Artemis.UI.Shared/Properties/Settings.settings delete mode 100644 src/Artemis.UI.Shared/PropertyInput/PropertyInputRegistration.cs delete mode 100644 src/Artemis.UI.Shared/PropertyInput/PropertyInputViewModel.cs rename src/{Avalonia => }/Artemis.UI.Shared/Providers/IColorGradientStorageProvider.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Providers/ICursorProvider.cs (100%) delete mode 100644 src/Artemis.UI.Shared/ResourceDictionaries/DataModelConditions.xaml delete mode 100644 src/Artemis.UI.Shared/Resources/ArtemisShared.xaml delete mode 100644 src/Artemis.UI.Shared/Resources/Fonts/RobotoMono-Regular.ttf delete mode 100644 src/Artemis.UI.Shared/Screens/Dialogs/ConfirmDialogView.xaml delete mode 100644 src/Artemis.UI.Shared/Screens/Dialogs/ConfirmDialogViewModel.cs delete mode 100644 src/Artemis.UI.Shared/Screens/Exceptions/ExceptionView.xaml delete mode 100644 src/Artemis.UI.Shared/Screens/Exceptions/ExceptionViewModel.cs delete mode 100644 src/Artemis.UI.Shared/Screens/GradientEditor/ColorStopView.xaml delete mode 100644 src/Artemis.UI.Shared/Screens/GradientEditor/ColorStopViewModel.cs delete mode 100644 src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditorView.xaml delete mode 100644 src/Artemis.UI.Shared/Screens/GradientEditor/GradientEditorViewModel.cs rename src/{Avalonia => }/Artemis.UI.Shared/Services/Builders/ContentDialogBuilder.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/Builders/FileDialogFilterBuilder.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/Builders/NotificationBuilder.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/Builders/OpenFileDialogBuilder.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/Builders/SaveFileDialogBuilder.cs (100%) delete mode 100644 src/Artemis.UI.Shared/Services/ColorPickerService.cs delete mode 100644 src/Artemis.UI.Shared/Services/Dialog/DialogService.cs delete mode 100644 src/Artemis.UI.Shared/Services/Dialog/DialogViewModelBase.cs delete mode 100644 src/Artemis.UI.Shared/Services/Dialog/DialogViewModelHost.cs rename src/{Avalonia => }/Artemis.UI.Shared/Services/GradientPickerService.cs (100%) delete mode 100644 src/Artemis.UI.Shared/Services/Interfaces/IColorPickerService.cs delete mode 100644 src/Artemis.UI.Shared/Services/Interfaces/IDialogService.cs rename src/{Avalonia => }/Artemis.UI.Shared/Services/Interfaces/INotificationService.cs (100%) delete mode 100644 src/Artemis.UI.Shared/Services/Interfaces/IProfileEditorService.cs rename src/{Avalonia => }/Artemis.UI.Shared/Services/Interfaces/IWindowService.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/MainWindow/IMainWindowProvider.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/MainWindow/IMainWindowService.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/MainWindow/MainWindowService.cs (100%) delete mode 100644 src/Artemis.UI.Shared/Services/Message/IMessageService.cs delete mode 100644 src/Artemis.UI.Shared/Services/Message/INotificationProvider.cs delete mode 100644 src/Artemis.UI.Shared/Services/Message/MessageService.cs delete mode 100644 src/Artemis.UI.Shared/Services/Models/FolderClipboardModel.cs rename src/{Avalonia => }/Artemis.UI.Shared/Services/NodeEditor/Commands/AddNode.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/NodeEditor/Commands/AddPin.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/NodeEditor/Commands/CompositeCommand.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/NodeEditor/Commands/ConnectPins.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/NodeEditor/Commands/DeleteNode.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/NodeEditor/Commands/MoveNode.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/NodeEditor/Commands/RemovePin.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/NodeEditor/Commands/UpdateStorage.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/NodeEditor/INodeEditorCommand.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/NodeEditor/INodeEditorService.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/NodeEditor/NodeEditorCommandScope.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/NodeEditor/NodeEditorHistory.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/NodeEditor/NodeEditorService.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/NotificationService.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/Commands/AddProfileElement.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/Commands/ChangeKeyframeEasing.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/Commands/ChangeLayerBrush.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/Commands/ChangeLayerLeds.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/Commands/CompositeCommand.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/Commands/DeleteKeyframe.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/Commands/MoveKeyframe.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/Commands/MoveProfileEElement.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/Commands/RemoveProfileElement.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/Commands/RenameProfileElement.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/Commands/ResetLayerProperty.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/Commands/ResizeTimelineSegment.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/Commands/ToggleLayerPropertyKeyframes.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/Commands/UpdateLayerProperty.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/IProfileEditorCommand.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/IProfileEditorService.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/IToolViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/ProfileEditorCommandScope.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/ProfileEditorHistory.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/ProfileEditor/ProfileEditorService.cs (100%) delete mode 100644 src/Artemis.UI.Shared/Services/ProfileEditorService.cs rename src/{Avalonia => }/Artemis.UI.Shared/Services/PropertyInput/IPropertyInputService.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/PropertyInput/PropertyInputRegistration.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/PropertyInput/PropertyInputService.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/PropertyInput/PropertyInputViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/Window/ExceptionDialogView.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/Window/ExceptionDialogView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Services/Window/ExceptionDialogViewModel.cs (100%) delete mode 100644 src/Artemis.UI.Shared/Services/Window/IMainWindowProvider.cs delete mode 100644 src/Artemis.UI.Shared/Services/Window/IWindowService.cs rename src/{Avalonia => }/Artemis.UI.Shared/Styles/Artemis.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Styles/Border.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Styles/Button.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Styles/Condensed.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Styles/Controls/DataModelPicker.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Styles/Controls/DataModelPickerButton.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Styles/Controls/GradientPicker.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Styles/Controls/GradientPickerButton.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Styles/InfoBar.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Styles/Notifications.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Styles/NumberBox.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Styles/Sidebar.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Styles/TextBlock.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Styles/TextBox.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Shared/Styles/TreeView.axaml (100%) delete mode 100644 src/Artemis.UI.Shared/Utilities/BindingProxy.cs delete mode 100644 src/Artemis.UI.Shared/Utilities/DelegateCommand.cs delete mode 100644 src/Artemis.UI.Shared/Utilities/EnumUtilities.cs delete mode 100644 src/Artemis.UI.Shared/Utilities/HitTestUtilities.cs delete mode 100644 src/Artemis.UI.Shared/Utilities/JsonClipboard.cs delete mode 100644 src/Artemis.UI.Shared/Utilities/ShortcutUtilities.cs delete mode 100644 src/Artemis.UI.Shared/Utilities/TriggerTracing.cs delete mode 100644 src/Artemis.UI.Shared/Utilities/TypeUtilities.cs delete mode 100644 src/Artemis.UI.Shared/Utilities/VisualTreeUtilities.cs rename src/{Avalonia => }/Artemis.UI.Shared/ViewModelBase.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/VisualScripting/CustomNodeViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI.Shared/nuget.config (100%) rename src/{Avalonia => }/Artemis.UI.Windows/.gitignore (100%) rename src/{Avalonia => }/Artemis.UI.Windows/App.axaml (100%) rename src/{Avalonia => }/Artemis.UI.Windows/App.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI.Windows/ApplicationStateManager.cs (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Artemis.UI.Windows.csproj (94%) rename src/{Avalonia => }/Artemis.UI.Windows/Assets/Cursors/aero_crosshair.png (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Assets/Cursors/aero_crosshair_minus.png (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Assets/Cursors/aero_crosshair_plus.png (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Assets/Cursors/aero_drag.png (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Assets/Cursors/aero_drag_horizontal.png (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Assets/Cursors/aero_pen_min.png (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Assets/Cursors/aero_pen_plus.png (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Assets/Cursors/aero_rotate.png (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Assets/Cursors/aero_rotate_bl.png (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Assets/Cursors/aero_rotate_br.png (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Assets/Cursors/aero_rotate_tl.png (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Assets/Cursors/aero_rotate_tr.png (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Assets/avalonia-logo.ico (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Ninject/WindowsModule.cs (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Program.cs (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Properties/launchSettings.json (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Providers/CursorProvider.cs (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Providers/Input/SpongeWindow.cs (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Providers/Input/SpongeWindowEventArgs.cs (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Providers/Input/WindowsInputProvider.cs (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Utilities/InputUtilities.cs (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Utilities/ProcessUtilities.cs (100%) rename src/{Avalonia => }/Artemis.UI.Windows/Utilities/WindowUtilities.cs (100%) create mode 100644 src/Artemis.UI.Windows/packages.lock.json delete mode 100644 src/Artemis.UI/App.xaml delete mode 100644 src/Artemis.UI/App.xaml.cs delete mode 100644 src/Artemis.UI/ApplicationStateManager.cs rename src/{Avalonia => }/Artemis.UI/Artemis.UI.Avalonia.csproj.DotSettings (100%) rename src/{Avalonia => }/Artemis.UI/Artemis.UI.csproj.DotSettings (100%) rename src/{Avalonia => }/Artemis.UI/ArtemisBootstrapper.cs (100%) rename src/{Avalonia => }/Artemis.UI/ArtemisTrayIcon.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Assets/Images/Logo/application.ico (100%) rename src/Artemis.UI/{Resources => Assets}/Images/Logo/bow-black.ico (100%) rename src/Artemis.UI/{Resources => Assets}/Images/Logo/bow-white.ico (100%) rename src/Artemis.UI/{Resources => Assets}/Images/Logo/bow-white.svg (100%) rename src/Artemis.UI/{Resources => Assets}/Images/Logo/bow.ico (100%) rename src/Artemis.UI/{Resources => Assets}/Images/Logo/bow.svg (100%) rename src/{Avalonia => }/Artemis.UI/Assets/Images/home-banner.png (100%) rename src/{Avalonia => }/Artemis.UI/Assets/avalonia-logo.ico (100%) delete mode 100644 src/Artemis.UI/Behaviors/HighlightTermBehavior.cs delete mode 100644 src/Artemis.UI/Behaviors/InputBindingBehavior.cs delete mode 100644 src/Artemis.UI/Behaviors/MouseBehavior.cs rename src/{Avalonia => }/Artemis.UI/Behaviors/SimpleContextDragBehavior.cs (100%) rename src/{Avalonia => }/Artemis.UI/Behaviors/TreeItemDragBehavior.cs (100%) delete mode 100644 src/Artemis.UI/Behaviors/TreeViewSelectionBehavior.cs delete mode 100644 src/Artemis.UI/Bootstrapper.cs delete mode 100644 src/Artemis.UI/Controllers/RemoteController.cs rename src/{Avalonia => }/Artemis.UI/Controls/TimelineHeader.cs (100%) rename src/{Avalonia => }/Artemis.UI/Converters/ColorLuminosityConverter.cs (100%) rename src/{Avalonia => }/Artemis.UI/Converters/ColorOpacityConverter.cs (100%) delete mode 100644 src/Artemis.UI/Converters/ComparisonConverter.cs rename src/{Avalonia => }/Artemis.UI/Converters/DoubleToGridLengthConverter.cs (100%) delete mode 100644 src/Artemis.UI/Converters/EnumToCollectionConverter.cs delete mode 100644 src/Artemis.UI/Converters/InverseBooleanConverter.cs delete mode 100644 src/Artemis.UI/Converters/LeftMarginMultiplierConverter.cs delete mode 100644 src/Artemis.UI/Converters/NullToBooleanConverter.cs delete mode 100644 src/Artemis.UI/Converters/NullToImageConverter.cs rename src/{Avalonia => }/Artemis.UI/Converters/PropertyTreeMarginConverter.cs (100%) rename src/{Avalonia => }/Artemis.UI/Converters/SKColorToColor2Converter.cs (100%) delete mode 100644 src/Artemis.UI/Converters/SolidColorBrushToColorConverter.cs delete mode 100644 src/Artemis.UI/DataTemplateSelectors/ComboBoxTemplateSelector.cs delete mode 100644 src/Artemis.UI/DefaultTypes/DataModel/Display/SKColorDataModelDisplayView.xaml delete mode 100644 src/Artemis.UI/DefaultTypes/DataModel/Display/SKColorDataModelDisplayViewModel.cs delete mode 100644 src/Artemis.UI/DefaultTypes/DataModel/Input/BoolDataModelInputView.xaml delete mode 100644 src/Artemis.UI/DefaultTypes/DataModel/Input/BoolDataModelInputViewModel.cs delete mode 100644 src/Artemis.UI/DefaultTypes/DataModel/Input/DoubleDataModelInputView.xaml delete mode 100644 src/Artemis.UI/DefaultTypes/DataModel/Input/DoubleDataModelInputViewModel.cs delete mode 100644 src/Artemis.UI/DefaultTypes/DataModel/Input/EnumDataModelInputView.xaml delete mode 100644 src/Artemis.UI/DefaultTypes/DataModel/Input/EnumDataModelInputViewModel.cs delete mode 100644 src/Artemis.UI/DefaultTypes/DataModel/Input/IntDataModelInputView.xaml delete mode 100644 src/Artemis.UI/DefaultTypes/DataModel/Input/IntDataModelInputViewModel.cs delete mode 100644 src/Artemis.UI/DefaultTypes/DataModel/Input/SKColorDataModelInputView.xaml delete mode 100644 src/Artemis.UI/DefaultTypes/DataModel/Input/SKColorDataModelInputViewModel.cs delete mode 100644 src/Artemis.UI/DefaultTypes/DataModel/Input/StringDataModelInputView.xaml delete mode 100644 src/Artemis.UI/DefaultTypes/DataModel/Input/StringDataModelInputViewModel.cs rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/BoolPropertyInputView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/BoolPropertyInputView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/DefaultTypes/PropertyInput/BoolPropertyInputView.xaml rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/BrushPropertyInputView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/BrushPropertyInputView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/DefaultTypes/PropertyInput/BrushPropertyInputView.xaml rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/ColorGradientPropertyInputView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/ColorGradientPropertyInputView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/DefaultTypes/PropertyInput/ColorGradientPropertyInputView.xaml rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/EnumPropertyInputView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/EnumPropertyInputView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/DefaultTypes/PropertyInput/EnumPropertyInputView.xaml rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/FloatPropertyInputView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/FloatPropertyInputView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/DefaultTypes/PropertyInput/FloatPropertyInputView.xaml rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/FloatRangePropertyInputView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/FloatRangePropertyInputView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/DefaultTypes/PropertyInput/FloatRangePropertyInputView.xaml rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/IntPropertyInputView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/IntPropertyInputView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/DefaultTypes/PropertyInput/IntPropertyInputView.xaml rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/IntRangePropertyInputView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/IntRangePropertyInputView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/DefaultTypes/PropertyInput/IntRangePropertyInputView.xaml rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/PropertyInputStyles.axaml (100%) rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/SKColorPropertyInputView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/SKColorPropertyInputView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/DefaultTypes/PropertyInput/SKColorPropertyInputView.xaml rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/SKPointPropertyInputView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/SKPointPropertyInputView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/DefaultTypes/PropertyInput/SKPointPropertyInputView.xaml rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/SKSizePropertyInputView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/SKSizePropertyInputView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/DefaultTypes/PropertyInput/SKSizePropertyInputView.xaml rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/StringPropertyInputView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/StringPropertyInputView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/DefaultTypes/PropertyInput/StringPropertyInputViewModel.cs (100%) delete mode 100644 src/Artemis.UI/Events/MainWindowFocusChangedEvent.cs delete mode 100644 src/Artemis.UI/Events/MainWindowKeyEvent.cs delete mode 100644 src/Artemis.UI/Events/MainWindowMouseEvent.cs delete mode 100644 src/Artemis.UI/Events/RequestSelectSidebarItemEvent.cs delete mode 100644 src/Artemis.UI/Events/ShapeControlEventArgs.cs delete mode 100644 src/Artemis.UI/Events/WindowsThemeEventArgs.cs delete mode 100644 src/Artemis.UI/Extensions/RgbColorExtensions.cs delete mode 100644 src/Artemis.UI/Extensions/RgbRectangleExtensions.cs delete mode 100644 src/Artemis.UI/Extensions/ScreenExtensions.cs delete mode 100644 src/Artemis.UI/Extensions/TreeViewItemExtensions.cs rename src/{Avalonia => }/Artemis.UI/MainWindow.axaml (100%) rename src/{Avalonia => }/Artemis.UI/MainWindow.axaml.cs (100%) delete mode 100644 src/Artemis.UI/Ninject/PluginUIModule.cs delete mode 100644 src/Artemis.UI/Ninject/ViewsSelfBindingResolver.cs delete mode 100644 src/Artemis.UI/Properties/AssemblyInfo.cs delete mode 100644 src/Artemis.UI/Properties/PublishProfiles/FolderProfile.pubxml delete mode 100644 src/Artemis.UI/Properties/Resources.Designer.cs delete mode 100644 src/Artemis.UI/Properties/Resources.resx delete mode 100644 src/Artemis.UI/Properties/Settings.Designer.cs delete mode 100644 src/Artemis.UI/Properties/Settings.settings delete mode 100644 src/Artemis.UI/Properties/launchSettings.json delete mode 100644 src/Artemis.UI/Providers/NativeWindowInputProvider.cs delete mode 100644 src/Artemis.UI/Providers/SpongeWindow.cs delete mode 100644 src/Artemis.UI/Providers/ToastNotificationProvider.cs rename src/{Avalonia => }/Artemis.UI/ReactiveCoreWindow.cs (100%) delete mode 100644 src/Artemis.UI/ResourceDictionaries/DataModelConditions.xaml delete mode 100644 src/Artemis.UI/ResourceDictionaries/LayerBrushDescriptors.xaml delete mode 100644 src/Artemis.UI/ResourceDictionaries/Scrollbar.xaml delete mode 100644 src/Artemis.UI/ResourceDictionaries/SideNavigation.xaml delete mode 100644 src/Artemis.UI/Resources/Artemis 2 - Autorun.xml delete mode 100644 src/Artemis.UI/Resources/Cursors/aero_crosshair.cur delete mode 100644 src/Artemis.UI/Resources/Cursors/aero_crosshair_minus.cur delete mode 100644 src/Artemis.UI/Resources/Cursors/aero_crosshair_plus.cur delete mode 100644 src/Artemis.UI/Resources/Cursors/aero_drag.cur delete mode 100644 src/Artemis.UI/Resources/Cursors/aero_drag_ew.cur delete mode 100644 src/Artemis.UI/Resources/Cursors/aero_fill.cur delete mode 100644 src/Artemis.UI/Resources/Cursors/aero_pen_min.cur delete mode 100644 src/Artemis.UI/Resources/Cursors/aero_pen_plus.cur delete mode 100644 src/Artemis.UI/Resources/Cursors/aero_rotate.cur delete mode 100644 src/Artemis.UI/Resources/Cursors/aero_rotate_bl.cur delete mode 100644 src/Artemis.UI/Resources/Cursors/aero_rotate_br.cur delete mode 100644 src/Artemis.UI/Resources/Cursors/aero_rotate_tl.cur delete mode 100644 src/Artemis.UI/Resources/Cursors/aero_rotate_tr.cur delete mode 100644 src/Artemis.UI/Resources/Fonts/RobotoMono-Regular.ttf delete mode 100644 src/Artemis.UI/Resources/Images/PhysicalLayouts/abnt.png delete mode 100644 src/Artemis.UI/Resources/Images/PhysicalLayouts/ansi.png delete mode 100644 src/Artemis.UI/Resources/Images/PhysicalLayouts/iso.png delete mode 100644 src/Artemis.UI/Resources/Images/PhysicalLayouts/jis.png delete mode 100644 src/Artemis.UI/Resources/Images/PhysicalLayouts/ks.png delete mode 100644 src/Artemis.UI/Resources/Images/Sidebar/sidebar-header.png rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/DebugView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/DebugView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/DebugViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/DataModel/DataModelDebugView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/DataModel/DataModelDebugView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/DataModel/DataModelDebugViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Logs/LogsDebugView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Logs/LogsDebugView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Logs/LogsDebugViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Performance/PerformanceDebugMeasurementViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Performance/PerformanceDebugPluginView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Performance/PerformanceDebugPluginView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Performance/PerformanceDebugPluginViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Performance/PerformanceDebugProfilerView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Performance/PerformanceDebugProfilerView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Performance/PerformanceDebugProfilerViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Performance/PerformanceDebugView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Performance/PerformanceDebugView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Performance/PerformanceDebugViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Render/RenderDebugView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Render/RenderDebugView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Render/RenderDebugViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Settings/DebugSettingsView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Settings/DebugSettingsView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Debugger/Tabs/Settings/DebugSettingsViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/DeviceDetectInputView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/DeviceDetectInputView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/DeviceDetectInputViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/DevicePropertiesView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/DevicePropertiesView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/DevicePropertiesViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/DeviceSettingsView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/DeviceSettingsView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/DeviceSettingsViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/Tabs/DeviceInfoTabView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/Tabs/DeviceInfoTabView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/Tabs/DeviceInfoTabViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/Tabs/DeviceLedsTabView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/Tabs/DeviceLedsTabView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/Tabs/DeviceLedsTabViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/Tabs/DevicePropertiesTabView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/Tabs/DevicePropertiesTabView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/Tabs/DevicePropertiesTabViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/Tabs/InputMappingsTabView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/Tabs/InputMappingsTabView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Device/Tabs/InputMappingsTabViewModel.cs (100%) delete mode 100644 src/Artemis.UI/Screens/Header/SimpleHeaderView.xaml delete mode 100644 src/Artemis.UI/Screens/Header/SimpleHeaderViewModel.cs rename src/{Avalonia => }/Artemis.UI/Screens/Home/HomeView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Home/HomeView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/Screens/Home/HomeView.xaml delete mode 100644 src/Artemis.UI/Screens/IScreenViewModel.cs rename src/{Avalonia => }/Artemis.UI/Screens/MainScreenViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesInstallDialogViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Plugins/Dialogs/PluginPrerequisitesUninstallDialogViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Plugins/PluginFeatureView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Plugins/PluginFeatureView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Plugins/PluginFeatureViewModel.cs (100%) delete mode 100644 src/Artemis.UI/Screens/Plugins/PluginPrerequisiteActionView.xaml delete mode 100644 src/Artemis.UI/Screens/Plugins/PluginPrerequisiteView.xaml delete mode 100644 src/Artemis.UI/Screens/Plugins/PluginPrerequisitesInstallDialogView.xaml delete mode 100644 src/Artemis.UI/Screens/Plugins/PluginPrerequisitesInstallDialogViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Plugins/PluginPrerequisitesUninstallDialogView.xaml delete mode 100644 src/Artemis.UI/Screens/Plugins/PluginPrerequisitesUninstallDialogViewModel.cs rename src/{Avalonia => }/Artemis.UI/Screens/Plugins/PluginSettingsView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Plugins/PluginSettingsView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Plugins/PluginSettingsViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Plugins/PluginSettingsWindowView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Plugins/PluginSettingsWindowView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Plugins/PluginSettingsWindowViewModel.cs (100%) delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Dialogs/LayerBrushPresetView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Dialogs/LayerBrushPresetViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Dialogs/RenameView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Dialogs/RenameView.xaml.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Dialogs/RenameViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/DisplayConditionsView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/DisplayConditionsViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/Event/EventConditionView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/Event/EventConditionViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/Static/StaticConditionView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/Static/StaticConditionViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/IProfileEditorPanelViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/DataBindings/DataBindingsView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/DataBindings/DataBindingsViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/LayerEffects/EffectsView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/LayerEffects/EffectsViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/LayerPropertiesView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/LayerPropertiesView.xaml.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/LayerPropertiesViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/LayerPropertyGroupViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/LayerPropertyViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Timeline/Controls/PropertyTimelineHeader.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Timeline/Dialogs/TimelineSegmentDialogView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Timeline/Dialogs/TimelineSegmentDialogViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Timeline/Models/KeyframeClipboardModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Timeline/TimelineEasingViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Timeline/TimelineGroupView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Timeline/TimelineGroupViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Timeline/TimelineKeyframeViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Timeline/TimelinePropertyView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Timeline/TimelinePropertyViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Timeline/TimelineSegmentView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Timeline/TimelineSegmentViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Timeline/TimelineView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Timeline/TimelineViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Tree/TreeGroupView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Tree/TreeGroupViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Tree/TreePropertyView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Tree/TreePropertyViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Tree/TreeView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/LayerProperties/Tree/TreeViewModel.cs rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/MenuBar/MenuBarView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/MenuBar/MenuBarView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/MenuBar/MenuBarViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Playback/PlaybackView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Playback/PlaybackView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Playback/PlaybackViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/Behaviors/ProfileTreeViewDropHandler.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/FolderTreeItemView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/FolderTreeItemView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/FolderTreeItemViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/LayerTreeItemView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/LayerTreeItemView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/LayerTreeItemViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/ProfileTreeView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/ProfileTreeView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/ProfileTreeViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/ProfileTree/TreeItemViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/PropertiesView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/PropertiesView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/PropertiesViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/PropertyGroupViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/PropertyViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/ITimelinePropertyViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/ITimelineKeyframeViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineEasingView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineEasingView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineEasingViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Keyframes/TimelineKeyframeViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/EndSegmentViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/MainSegmentViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/Segment.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/StartSegmentViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/Segments/TimelineSegmentViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineGroupViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelinePropertyViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Timeline/TimelineViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/Dialogs/LayerBrushPresetViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/ITreePropertyViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreeGroupViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Tree/TreePropertyViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/BrushConfigurationWindowViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/Properties/Windows/EffectConfigurationWindowViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/StatusBar/StatusBarView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/StatusBar/StatusBarView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/StatusBar/StatusBarViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Tools/SelectionAddToolView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Tools/SelectionAddToolView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Tools/SelectionAddToolViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Tools/SelectionRemoveToolView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Tools/SelectionRemoveToolView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Tools/SelectionRemoveToolViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Tools/TransformToolView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Tools/TransformToolView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Tools/TransformToolViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/VisualEditorViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/IVisualizerViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/LayerShapeVisualizerView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/LayerShapeVisualizerView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/LayerShapeVisualizerViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/LayerVisualizerView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/LayerVisualizerView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/Panels/VisualEditor/Visualizers/LayerVisualizerViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/ProfileEditorTitleBarView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/ProfileEditorTitleBarView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/ProfileEditorTitleBarViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/ProfileEditorView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/ProfileEditor/ProfileEditorView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/ProfileEditorView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/AdaptionHintViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/CategoryAdaptionHintView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/CategoryAdaptionHintViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/DeviceAdaptionHintView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/DeviceAdaptionHintViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/KeyboardSectionAdaptionHintView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/AdaptionHints/KeyboardSectionAdaptionHintViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/LayerHintsDialogView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/ProfileTree/Dialogs/LayerHintsDialogViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/ProfileTree/ProfileTreeView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/ProfileTree/ProfileTreeViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/ProfileTree/TreeItem/FolderView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/ProfileTree/TreeItem/FolderViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/ProfileTree/TreeItem/LayerView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/ProfileTree/TreeItem/LayerViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/ProfileTree/TreeItem/TreeItemViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/SuspendedProfileEditorView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/SuspendedProfileEditorViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/CanvasViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/ProfileLayerView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/ProfileLayerViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/ProfileView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/ProfileViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/Tools/EditToolView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/Tools/EditToolViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/Tools/SelectionRemoveToolView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/Tools/SelectionRemoveToolView.xaml.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/Tools/SelectionRemoveToolViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/Tools/SelectionToolView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/Tools/SelectionToolView.xaml.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/Tools/SelectionToolViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/Tools/ViewpointMoveToolView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/Tools/ViewpointMoveToolView.xaml.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/Tools/ViewpointMoveToolViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/Tools/VisualizationToolViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/UserControls/LayerShapeControl.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Visualization/UserControls/LayerShapeControl.xaml.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Windows/LayerBrushSettingsWindowView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Windows/LayerBrushSettingsWindowViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Windows/LayerEffectSettingsWindowView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Windows/LayerEffectSettingsWindowViewModel.cs delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Windows/NodeScriptWindowView.xaml delete mode 100644 src/Artemis.UI/Screens/ProfileEditor/Windows/NodeScriptWindowViewModel.cs rename src/{Avalonia => }/Artemis.UI/Screens/Root/DefaultTitleBarView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Root/DefaultTitleBarView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Root/DefaultTitleBarViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Root/RootView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Root/RootView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Root/RootViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Root/SplashView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Root/SplashView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Root/SplashViewModel.cs (100%) delete mode 100644 src/Artemis.UI/Screens/RootView.xaml delete mode 100644 src/Artemis.UI/Screens/RootViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Scripting/Dialogs/ScriptConfigurationCreateView.xaml delete mode 100644 src/Artemis.UI/Screens/Scripting/Dialogs/ScriptConfigurationCreateViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Scripting/Dialogs/ScriptConfigurationEditView.xaml delete mode 100644 src/Artemis.UI/Screens/Scripting/Dialogs/ScriptConfigurationEditViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Scripting/ScriptConfigurationViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Scripting/ScriptsDialogView.xaml delete mode 100644 src/Artemis.UI/Screens/Scripting/ScriptsDialogViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Debug/DebugView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Debug/DebugViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Debug/Tabs/DataModelDebugView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Debug/Tabs/DataModelDebugViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Debug/Tabs/LogsDebugView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Debug/Tabs/LogsDebugView.xaml.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Debug/Tabs/LogsDebugViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugMeasurementViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugPluginView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugPluginViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugProfilerView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugProfilerViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugView.xaml.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Debug/Tabs/Performance/PerformanceDebugViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Debug/Tabs/RenderDebugView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Debug/Tabs/RenderDebugViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Device/DeviceDialogView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Device/DeviceDialogViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Device/DeviceLayoutDialogView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Device/DeviceLayoutDialogViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceInfoTabView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceInfoTabViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceLedsTabView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Device/Tabs/DeviceLedsTabViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Device/Tabs/DevicePropertiesTabView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Device/Tabs/DevicePropertiesTabViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Device/Tabs/InputMappingsTabView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Device/Tabs/InputMappingsTabViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Device/Tabs/SurfaceDeviceConfigViewModelValidator.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Dialogs/UpdateDialogView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Dialogs/UpdateDialogViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/SettingsTabsView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/SettingsTabsViewModel.cs rename src/{Avalonia => }/Artemis.UI/Screens/Settings/SettingsView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Settings/SettingsView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/Screens/Settings/SettingsView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Tabs/About/AboutTabView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Tabs/About/AboutTabViewModel.cs rename src/{Avalonia => }/Artemis.UI/Screens/Settings/Tabs/AboutTabView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Settings/Tabs/AboutTabView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Settings/Tabs/AboutTabViewModel.cs (100%) delete mode 100644 src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsTabView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsTabViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Tabs/Devices/DeviceSettingsViewModel.cs rename src/{Avalonia => }/Artemis.UI/Screens/Settings/Tabs/DevicesTabView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Settings/Tabs/DevicesTabView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Settings/Tabs/DevicesTabViewModel.cs (100%) delete mode 100644 src/Artemis.UI/Screens/Settings/Tabs/General/GeneralSettingsTabView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Tabs/General/GeneralSettingsTabViewModel.cs rename src/{Avalonia => }/Artemis.UI/Screens/Settings/Tabs/GeneralTabView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Settings/Tabs/GeneralTabView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Settings/Tabs/GeneralTabViewModel.cs (100%) delete mode 100644 src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginFeatureView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginFeatureViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsTabView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsTabViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsView.xaml.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsWindowView.xaml delete mode 100644 src/Artemis.UI/Screens/Settings/Tabs/Plugins/PluginSettingsWindowViewModel.cs rename src/{Avalonia => }/Artemis.UI/Screens/Settings/Tabs/PluginsTabView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Settings/Tabs/PluginsTabView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Settings/Tabs/PluginsTabViewModel.cs (100%) delete mode 100644 src/Artemis.UI/Screens/Shared/PanZoomViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Sidebar/ArtemisSidebar.xaml rename src/{Avalonia => }/Artemis.UI/Screens/Sidebar/ContentDialogs/SidebarCategoryEditView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Sidebar/ContentDialogs/SidebarCategoryEditView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Sidebar/ContentDialogs/SidebarCategoryEditViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Sidebar/Dialogs/ProfileConfigurationEditView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Sidebar/Dialogs/ProfileConfigurationEditView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Sidebar/Dialogs/ProfileConfigurationEditViewModel.cs (100%) delete mode 100644 src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileEdit/ModuleActivationRequirementView.xaml delete mode 100644 src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileEdit/ModuleActivationRequirementViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileEdit/ModuleActivationRequirementsView.xaml delete mode 100644 src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileEdit/ModuleActivationRequirementsViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileEdit/ProfileConfigurationHotkeyView.xaml delete mode 100644 src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileEdit/ProfileConfigurationHotkeyViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileEdit/ProfileEditView.xaml delete mode 100644 src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileEdit/ProfileEditViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileEdit/ProfileIconViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Sidebar/Dialogs/ProfileEdit/ProfileModuleViewModel.cs rename src/{Avalonia => }/Artemis.UI/Screens/Sidebar/Dialogs/ProfileIconViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Sidebar/Dialogs/ProfileModuleViewModel.cs (100%) delete mode 100644 src/Artemis.UI/Screens/Sidebar/Dialogs/SidebarCategoryCreateView.xaml delete mode 100644 src/Artemis.UI/Screens/Sidebar/Dialogs/SidebarCategoryCreateViewModel.cs delete mode 100644 src/Artemis.UI/Screens/Sidebar/Dialogs/SidebarCategoryUpdateView.xaml delete mode 100644 src/Artemis.UI/Screens/Sidebar/Dialogs/SidebarCategoryUpdateViewModel.cs rename src/{Avalonia => }/Artemis.UI/Screens/Sidebar/SidebarCategoryView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Sidebar/SidebarCategoryView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/Screens/Sidebar/SidebarCategoryView.xaml delete mode 100644 src/Artemis.UI/Screens/Sidebar/SidebarCategoryView.xaml.cs rename src/{Avalonia => }/Artemis.UI/Screens/Sidebar/SidebarProfileConfigurationView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Sidebar/SidebarProfileConfigurationView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/Screens/Sidebar/SidebarProfileConfigurationView.xaml rename src/{Avalonia => }/Artemis.UI/Screens/Sidebar/SidebarScreenView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Sidebar/SidebarScreenView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/Screens/Sidebar/SidebarScreenView.xaml rename src/{Avalonia => }/Artemis.UI/Screens/Sidebar/SidebarView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Sidebar/SidebarView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/Screens/Sidebar/SidebarView.xaml delete mode 100644 src/Artemis.UI/Screens/Splash/SplashView.xaml delete mode 100644 src/Artemis.UI/Screens/Splash/SplashViewModel.cs delete mode 100644 src/Artemis.UI/Screens/StartupWizard/StartupWizardView.xaml delete mode 100644 src/Artemis.UI/Screens/StartupWizard/StartupWizardViewModel.cs delete mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/DevicesStepView.xaml delete mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/DevicesStepViewModel.cs delete mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/FinishStepView.xaml delete mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/FinishStepViewModel.cs delete mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/LayoutStepView.xaml delete mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/LayoutStepViewModel.cs delete mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/SettingsStepView.xaml delete mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/SettingsStepViewModel.cs delete mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/WelcomeStepView.xaml delete mode 100644 src/Artemis.UI/Screens/StartupWizard/Steps/WelcomeStepViewModel.cs delete mode 100644 src/Artemis.UI/Screens/SurfaceEditor/Dialogs/SurfaceDeviceDetectInputView.xaml delete mode 100644 src/Artemis.UI/Screens/SurfaceEditor/Dialogs/SurfaceDeviceDetectInputViewModel.cs rename src/{Avalonia => }/Artemis.UI/Screens/SurfaceEditor/ListDeviceView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/SurfaceEditor/ListDeviceView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/SurfaceEditor/ListDeviceViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/SurfaceEditor/SurfaceDeviceView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/SurfaceEditor/SurfaceDeviceView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/SurfaceEditor/SurfaceDeviceViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorView.xaml delete mode 100644 src/Artemis.UI/Screens/SurfaceEditor/Visualization/ListDeviceView.xaml delete mode 100644 src/Artemis.UI/Screens/SurfaceEditor/Visualization/ListDeviceViewModel.cs delete mode 100644 src/Artemis.UI/Screens/SurfaceEditor/Visualization/SurfaceDeviceView.xaml delete mode 100644 src/Artemis.UI/Screens/SurfaceEditor/Visualization/SurfaceDeviceViewModel.cs delete mode 100644 src/Artemis.UI/Screens/TrayView.xaml delete mode 100644 src/Artemis.UI/Screens/TrayViewModel.cs rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/CableView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/CableView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/CableViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/DragCableView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/DragCableView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/DragCableViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/NodePickerView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/NodePickerView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/NodePickerViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/NodeScriptView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/NodeScriptView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/NodeScriptViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/NodeView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/NodeView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/NodeViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/Pins/InputPinCollectionView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/Pins/InputPinCollectionView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/Pins/InputPinCollectionViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/Pins/InputPinView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/Pins/InputPinView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/Pins/InputPinViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/Pins/OutputPinCollectionView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/Pins/OutputPinCollectionView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/Pins/OutputPinCollectionViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/Pins/OutputPinView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/Pins/OutputPinView.axaml.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/Pins/OutputPinViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/Pins/PinCollectionViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/Pins/PinView.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/Pins/PinViewModel.cs (100%) rename src/{Avalonia => }/Artemis.UI/Screens/VisualScripting/VisualScripting.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Workshop/WorkshopView.axaml (100%) rename src/{Avalonia => }/Artemis.UI/Screens/Workshop/WorkshopView.axaml.cs (100%) delete mode 100644 src/Artemis.UI/Screens/Workshop/WorkshopView.xaml delete mode 100644 src/Artemis.UI/Services/DeviceLayoutService.cs delete mode 100644 src/Artemis.UI/Services/Interfaces/ILayerEditorService.cs rename src/{Avalonia => }/Artemis.UI/Services/Interfaces/IRegistrationService.cs (100%) delete mode 100644 src/Artemis.UI/Services/Interfaces/IThemeService.cs delete mode 100644 src/Artemis.UI/Services/LayerEditorService.cs delete mode 100644 src/Artemis.UI/Services/Models/UpdateService/DevOpsBuilds.cs delete mode 100644 src/Artemis.UI/Services/Models/UpdateService/GitHubDifference.cs delete mode 100644 src/Artemis.UI/Services/ThemeService.cs delete mode 100644 src/Artemis.UI/Services/UpdateService.cs delete mode 100644 src/Artemis.UI/SkiaSharp/Vulkan/Kernel32.cs delete mode 100644 src/Artemis.UI/SkiaSharp/Vulkan/VkContext.cs delete mode 100644 src/Artemis.UI/SkiaSharp/Vulkan/Win32VkContext.cs delete mode 100644 src/Artemis.UI/SkiaSharp/VulkanContext.cs rename src/{Avalonia => }/Artemis.UI/Styles/Artemis.axaml (100%) delete mode 100644 src/Artemis.UI/Stylet/ArtemisViewManager.cs delete mode 100644 src/Artemis.UI/Stylet/FluentValidationAdapter.cs delete mode 100644 src/Artemis.UI/Stylet/NinjectBootstrapper.cs delete mode 100644 src/Artemis.UI/Utilities/BindingProxy.cs delete mode 100644 src/Artemis.UI/Utilities/DPIAwareness.cs delete mode 100644 src/Artemis.UI/Utilities/ProcessUtilities.cs delete mode 100644 src/Artemis.UI/Utilities/SettingsUtilities.cs delete mode 100644 src/Artemis.UI/Utilities/WindowState.cs delete mode 100644 src/Artemis.UI/Utilities/WindowUtilities.cs rename src/{Avalonia => }/Artemis.UI/ViewLocator.cs (100%) delete mode 100644 src/Artemis.VisualScripting/Behaviors/HighlightTermBehavior.cs delete mode 100644 src/Artemis.VisualScripting/Converters/CenterTranslateConverter.cs rename src/{Avalonia => }/Artemis.VisualScripting/Converters/NumericConverter.cs (100%) delete mode 100644 src/Artemis.VisualScripting/Editor/Controls/VisualScriptCablePresenter.cs delete mode 100644 src/Artemis.VisualScripting/Editor/Controls/VisualScriptEditor.cs delete mode 100644 src/Artemis.VisualScripting/Editor/Controls/VisualScriptNodeCreationBox.cs delete mode 100644 src/Artemis.VisualScripting/Editor/Controls/VisualScriptNodePresenter.cs delete mode 100644 src/Artemis.VisualScripting/Editor/Controls/VisualScriptPinPresenter.cs delete mode 100644 src/Artemis.VisualScripting/Editor/Controls/VisualScriptPresenter.cs delete mode 100644 src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScript.cs delete mode 100644 src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScriptCable.cs delete mode 100644 src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScriptNode.cs delete mode 100644 src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScriptPin.cs delete mode 100644 src/Artemis.VisualScripting/Editor/Controls/Wrapper/VisualScriptPinCollection.cs delete mode 100644 src/Artemis.VisualScripting/Editor/EditorStyles.xaml delete mode 100644 src/Artemis.VisualScripting/Editor/Styles/VisualScriptCablePresenter.xaml delete mode 100644 src/Artemis.VisualScripting/Editor/Styles/VisualScriptEditor.xaml delete mode 100644 src/Artemis.VisualScripting/Editor/Styles/VisualScriptNodeCreationBox.xaml delete mode 100644 src/Artemis.VisualScripting/Editor/Styles/VisualScriptNodePresenter.xaml delete mode 100644 src/Artemis.VisualScripting/Editor/Styles/VisualScriptPinPresenter.xaml delete mode 100644 src/Artemis.VisualScripting/Editor/Styles/VisualScriptPresenter.xaml delete mode 100644 src/Artemis.VisualScripting/Events/NodeAddedEventManager.cs delete mode 100644 src/Artemis.VisualScripting/Events/NodeRemovedEventManager.cs delete mode 100644 src/Artemis.VisualScripting/Events/PinAddedEventManager.cs delete mode 100644 src/Artemis.VisualScripting/Events/PinConnectedEventArgs.cs delete mode 100644 src/Artemis.VisualScripting/Events/PinConnectedEventManager.cs delete mode 100644 src/Artemis.VisualScripting/Events/PinDisconnectedEventArgs.cs delete mode 100644 src/Artemis.VisualScripting/Events/PinDisconnectedEventManager.cs delete mode 100644 src/Artemis.VisualScripting/Events/PinRemovedEventManager.cs delete mode 100644 src/Artemis.VisualScripting/Events/VisualScriptNodeDragMovingEventArgs.cs delete mode 100644 src/Artemis.VisualScripting/Events/VisualScriptNodeIsSelectedChangedEventArgs.cs delete mode 100644 src/Artemis.VisualScripting/Internal/IsConnectingPin.cs delete mode 100644 src/Artemis.VisualScripting/Nodes/CustomViewModels/CustomNodeViewModel.cs delete mode 100644 src/Artemis.VisualScripting/Nodes/CustomViews/EnumEqualsNodeCustomView.xaml delete mode 100644 src/Artemis.VisualScripting/Nodes/CustomViews/LayerPropertyNodeCustomView.xaml rename src/{Avalonia => }/Artemis.VisualScripting/Nodes/CustomViews/StaticNumericValueNodeCustomView.axaml (100%) rename src/{Avalonia => }/Artemis.VisualScripting/Nodes/CustomViews/StaticNumericValueNodeCustomView.axaml.cs (100%) delete mode 100644 src/Artemis.VisualScripting/Nodes/CustomViews/StaticNumericValueNodeCustomView.xaml rename src/{Avalonia => }/Artemis.VisualScripting/Nodes/CustomViews/StaticStringValueNodeCustomView.axaml (100%) rename src/{Avalonia => }/Artemis.VisualScripting/Nodes/CustomViews/StaticStringValueNodeCustomView.axaml.cs (100%) delete mode 100644 src/Artemis.VisualScripting/Nodes/CustomViews/StaticStringValueNodeCustomView.xaml rename src/{Avalonia => }/Artemis.VisualScripting/Nodes/DataModel/CustomViews/DataModelEventNodeCustomView.axaml (100%) rename src/{Avalonia => }/Artemis.VisualScripting/Nodes/DataModel/CustomViews/DataModelEventNodeCustomView.axaml.cs (100%) delete mode 100644 src/Artemis.VisualScripting/Nodes/DataModel/CustomViews/DataModelEventNodeCustomView.xaml rename src/{Avalonia => }/Artemis.VisualScripting/Nodes/DataModel/CustomViews/DataModelNodeCustomView.axaml (100%) rename src/{Avalonia => }/Artemis.VisualScripting/Nodes/DataModel/CustomViews/DataModelNodeCustomView.axaml.cs (100%) delete mode 100644 src/Artemis.VisualScripting/Nodes/DataModel/CustomViews/DataModelNodeCustomView.xaml rename src/{Avalonia => }/Artemis.VisualScripting/Nodes/Easing/CustomViews/EasingTypeNodeCustomView.axaml (100%) rename src/{Avalonia => }/Artemis.VisualScripting/Nodes/Easing/CustomViews/EasingTypeNodeCustomView.axaml.cs (100%) delete mode 100644 src/Artemis.VisualScripting/Nodes/Easing/CustomViews/EasingTypeNodeCustomView.xaml delete mode 100644 src/Artemis.VisualScripting/Properties/DesignTimeResources.xaml delete mode 100644 src/Artemis.VisualScripting/ResourceDictionaries/DataModelConditions.xaml delete mode 100644 src/Artemis.VisualScripting/ViewModel/AbstractBindable.cs delete mode 100644 src/Artemis.VisualScripting/ViewModel/ActionCommand.cs create mode 100644 src/Artemis.sln.bak delete mode 100644 src/Avalonia/Artemis.UI.Shared/Artemis.UI.Shared.csproj delete mode 100644 src/Avalonia/Artemis.UI.Shared/Artemis.UI.Shared.csproj.DotSettings delete mode 100644 src/Avalonia/Artemis.UI.Shared/Controls/DeviceVisualizer.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Controls/DeviceVisualizerLed.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Converters/ColorGradientToGradientStopsConverter.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Converters/ColorToSKColorConverter.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Converters/SKColorToStringConverter.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Converters/TypeToStringConverter.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/DataModelVisualization/DataModelDisplayViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/DataModelVisualization/DataModelInputViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/DataModelVisualization/DataModelVisualizationRegistration.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelEventViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertiesViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertyViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelUpdateConfiguration.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelVisualizationViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.xaml delete mode 100644 src/Avalonia/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Events/DataModelSelectedEventArgs.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Events/LedClickedEventArgs.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Events/ProfileConfigurationEventArgs.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Events/RenderProfileElementEventArgs.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Exceptions/ArtemisUIException.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Ninject/SharedUIModule.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Plugins/LayerBrushes/BrushConfigurationViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Plugins/LayerBrushes/LayerBrushConfigurationDialog.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Plugins/LayerEffects/EffectConfigurationViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Plugins/LayerEffects/LayerEffectConfigurationDialog.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Plugins/PluginConfigurationDialog.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Plugins/PluginConfigurationViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Plugins/ScriptingProviders/ScriptEditorViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Services/DataModelUIService.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Services/Interfaces/IArtemisSharedUIService.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Services/Interfaces/IDataModelUIService.cs delete mode 100644 src/Avalonia/Artemis.UI.Shared/Services/Window/WindowService.cs delete mode 100644 src/Avalonia/Artemis.UI/Artemis.UI.csproj delete mode 100644 src/Avalonia/Artemis.UI/Assets/Images/Logo/bow-black.ico delete mode 100644 src/Avalonia/Artemis.UI/Assets/Images/Logo/bow-white.ico delete mode 100644 src/Avalonia/Artemis.UI/Assets/Images/Logo/bow-white.svg delete mode 100644 src/Avalonia/Artemis.UI/Assets/Images/Logo/bow.ico delete mode 100644 src/Avalonia/Artemis.UI/Assets/Images/Logo/bow.svg delete mode 100644 src/Avalonia/Artemis.UI/Converters/ColorToSolidColorBrushConverter.cs delete mode 100644 src/Avalonia/Artemis.UI/Converters/LedIdToStringConverter.cs delete mode 100644 src/Avalonia/Artemis.UI/Converters/NormalizedPercentageConverter.cs delete mode 100644 src/Avalonia/Artemis.UI/Converters/UriToFileNameConverter.cs delete mode 100644 src/Avalonia/Artemis.UI/Converters/ValuesAdditionConverter.cs delete mode 100644 src/Avalonia/Artemis.UI/DefaultTypes/PropertyInput/BoolPropertyInputViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/DefaultTypes/PropertyInput/BrushPropertyInputViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/DefaultTypes/PropertyInput/ColorGradientPropertyInputViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/DefaultTypes/PropertyInput/EnumPropertyInputViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/DefaultTypes/PropertyInput/FloatPropertyInputViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/DefaultTypes/PropertyInput/FloatRangePropertyInputViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/DefaultTypes/PropertyInput/IntPropertyInputViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/DefaultTypes/PropertyInput/IntRangePropertyInputViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/DefaultTypes/PropertyInput/SKColorPropertyInputViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/DefaultTypes/PropertyInput/SKPointPropertyInputViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/DefaultTypes/PropertyInput/SKSizePropertyInputViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/Exceptions/ArtemisGraphicsContextException.cs delete mode 100644 src/Avalonia/Artemis.UI/Exceptions/ArtemisUIException.cs delete mode 100644 src/Avalonia/Artemis.UI/Extensions/BindableCollectionExtensions.cs delete mode 100644 src/Avalonia/Artemis.UI/Ninject/Factories/IVMFactory.cs delete mode 100644 src/Avalonia/Artemis.UI/Ninject/InstanceProviders/LayerPropertyViewModelInstanceProvider.cs delete mode 100644 src/Avalonia/Artemis.UI/Ninject/UIModule.cs delete mode 100644 src/Avalonia/Artemis.UI/Screens/Home/HomeViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/Screens/Plugins/PluginPrerequisiteActionViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/Screens/Plugins/PluginPrerequisiteViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/Screens/ProfileEditor/ProfileEditorViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/Screens/Settings/SettingsViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/Screens/Sidebar/SidebarCategoryViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/Screens/Sidebar/SidebarProfileConfigurationViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/Screens/Sidebar/SidebarScreenViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/Screens/Sidebar/SidebarViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/Screens/SurfaceEditor/SurfaceEditorViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/Screens/Workshop/WorkshopViewModel.cs delete mode 100644 src/Avalonia/Artemis.UI/Services/DebugService.cs delete mode 100644 src/Avalonia/Artemis.UI/Services/Interfaces/IArtemisUIService.cs delete mode 100644 src/Avalonia/Artemis.UI/Services/Interfaces/IDebugService.cs delete mode 100644 src/Avalonia/Artemis.UI/Services/RegistrationService.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Artemis.VisualScripting.csproj delete mode 100644 src/Avalonia/Artemis.VisualScripting/Ninject/NoStringNinjectModule.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/BoolOperations.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Color/BrightenSKColorNode.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Color/CustomViewModels/StaticSKColorValueNodeCustomViewModel.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Color/CustomViews/StaticSKColorValueNodeCustomView.xaml delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Color/DarkenSKColorNode.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Color/DesaturateSKColorNode.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Color/HslSKColorNode.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Color/InvertSKColorNode.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Color/RotateHueSkColorNode.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Color/SaturateSkColorNode.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Color/StaticSKColorValueNode.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Color/SumSKColorsNode.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/ConvertNodes.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/CustomViewModels/EnumEqualsNodeCustomViewModel.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/CustomViewModels/LayerPropertyNodeCustomViewModel.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/CustomViewModels/StaticValueNodeViewModels.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/DataModel/CustomViewModels/DataModelEventNodeCustomViewModel.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/DataModel/CustomViewModels/DataModelNodeCustomViewModel.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/DataModel/DataModelEventNode.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/DataModel/DataModelNode.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Easing/CustomViewModels/EasingTypeNodeCustomViewModel.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Easing/CustomViewModels/NodeEasingViewModel.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Easing/EasingTypeNode.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Easing/NumericEasingNode.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Easing/SKColorEasingNode.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/LayerPropertyNode.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Maths/CustomViewModels/MathExpressionNodeCustomViewModel.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Maths/CustomViews/MathExpressionNodeCustomView.xaml delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Maths/ExpressionNode.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/Maths/RoundNode.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/StaticValueNodes.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/StringFormatNode.cs delete mode 100644 src/Avalonia/Artemis.VisualScripting/Nodes/SumNode.cs diff --git a/src/Avalonia/Artemis.UI.Linux/.gitignore b/src/Artemis.UI.Linux/.gitignore similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/.gitignore rename to src/Artemis.UI.Linux/.gitignore diff --git a/src/Avalonia/Artemis.UI.Linux/App.axaml b/src/Artemis.UI.Linux/App.axaml similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/App.axaml rename to src/Artemis.UI.Linux/App.axaml diff --git a/src/Avalonia/Artemis.UI.Linux/App.axaml.cs b/src/Artemis.UI.Linux/App.axaml.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/App.axaml.cs rename to src/Artemis.UI.Linux/App.axaml.cs diff --git a/src/Avalonia/Artemis.UI.Linux/ApplicationStateManager.cs b/src/Artemis.UI.Linux/ApplicationStateManager.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/ApplicationStateManager.cs rename to src/Artemis.UI.Linux/ApplicationStateManager.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Artemis.UI.Linux.csproj b/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj similarity index 90% rename from src/Avalonia/Artemis.UI.Linux/Artemis.UI.Linux.csproj rename to src/Artemis.UI.Linux/Artemis.UI.Linux.csproj index 40039f1d5..fce1bf446 100644 --- a/src/Avalonia/Artemis.UI.Linux/Artemis.UI.Linux.csproj +++ b/src/Artemis.UI.Linux/Artemis.UI.Linux.csproj @@ -4,6 +4,7 @@ net6.0 enable x64 + x64 @@ -18,7 +19,7 @@ - + \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Linux/Assets/avalonia-logo.ico b/src/Artemis.UI.Linux/Assets/avalonia-logo.ico similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Assets/avalonia-logo.ico rename to src/Artemis.UI.Linux/Assets/avalonia-logo.ico diff --git a/src/Avalonia/Artemis.UI.Linux/Program.cs b/src/Artemis.UI.Linux/Program.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Program.cs rename to src/Artemis.UI.Linux/Program.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxAbsoluteAxis.cs b/src/Artemis.UI.Linux/Providers/Input/LinuxAbsoluteAxis.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxAbsoluteAxis.cs rename to src/Artemis.UI.Linux/Providers/Input/LinuxAbsoluteAxis.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDevice.cs b/src/Artemis.UI.Linux/Providers/Input/LinuxInputDevice.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDevice.cs rename to src/Artemis.UI.Linux/Providers/Input/LinuxInputDevice.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceFinder.cs b/src/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceFinder.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceFinder.cs rename to src/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceFinder.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceReader.cs b/src/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceReader.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceReader.cs rename to src/Artemis.UI.Linux/Providers/Input/LinuxInputDeviceReader.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputEventArgs.cs b/src/Artemis.UI.Linux/Providers/Input/LinuxInputEventArgs.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputEventArgs.cs rename to src/Artemis.UI.Linux/Providers/Input/LinuxInputEventArgs.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputEventType.cs b/src/Artemis.UI.Linux/Providers/Input/LinuxInputEventType.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputEventType.cs rename to src/Artemis.UI.Linux/Providers/Input/LinuxInputEventType.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputProvider.cs b/src/Artemis.UI.Linux/Providers/Input/LinuxInputProvider.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxInputProvider.cs rename to src/Artemis.UI.Linux/Providers/Input/LinuxInputProvider.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxKeyboardKeyCodes.cs b/src/Artemis.UI.Linux/Providers/Input/LinuxKeyboardKeyCodes.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxKeyboardKeyCodes.cs rename to src/Artemis.UI.Linux/Providers/Input/LinuxKeyboardKeyCodes.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxRelativeAxis.cs b/src/Artemis.UI.Linux/Providers/Input/LinuxRelativeAxis.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Providers/Input/LinuxRelativeAxis.cs rename to src/Artemis.UI.Linux/Providers/Input/LinuxRelativeAxis.cs diff --git a/src/Avalonia/Artemis.UI.Linux/Utilities/InputUtilities.cs b/src/Artemis.UI.Linux/Utilities/InputUtilities.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Linux/Utilities/InputUtilities.cs rename to src/Artemis.UI.Linux/Utilities/InputUtilities.cs diff --git a/src/Artemis.UI.Linux/packages.lock.json b/src/Artemis.UI.Linux/packages.lock.json new file mode 100644 index 000000000..66c4330a9 --- /dev/null +++ b/src/Artemis.UI.Linux/packages.lock.json @@ -0,0 +1,1828 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Avalonia": { + "type": "Direct", + "requested": "[0.10.13, )", + "resolved": "0.10.13", + "contentHash": "7st8nMai1C1nqw1a2H+zXiVYTnnfFwZz7JGziEzJK4sF6+x/W77XkdcDgDHyihcK3clQZJexYr4f+PzK4BJhSQ==", + "dependencies": { + "Avalonia.Remote.Protocol": "0.10.13", + "JetBrains.Annotations": "10.3.0", + "System.ComponentModel.Annotations": "4.5.0", + "System.Memory": "4.5.3", + "System.Reactive": "5.0.0", + "System.Runtime.CompilerServices.Unsafe": "4.6.0", + "System.ValueTuple": "4.5.0" + } + }, + "Avalonia.Desktop": { + "type": "Direct", + "requested": "[0.10.13, )", + "resolved": "0.10.13", + "contentHash": "v+siRNQYvSZR9lt/bBgb81t6LGbSC7pUo+APgPmKYGLeYcMij1O6CWk7tCh9hihMxNHYw/PEB06r8ZBQIg9YPg==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Native": "0.10.13", + "Avalonia.Skia": "0.10.13", + "Avalonia.Win32": "0.10.13", + "Avalonia.X11": "0.10.13" + } + }, + "Avalonia.Diagnostics": { + "type": "Direct", + "requested": "[0.10.13, )", + "resolved": "0.10.13", + "contentHash": "stIGj0Rv/p/Re0GqlXCc061paifG6wT0YvrTUV/fQloNctW8Y4sf1xZNzr9dxdSz6+LG2AZjdZcSUhUGOCe6Zg==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Controls.DataGrid": "0.10.13", + "Microsoft.CodeAnalysis.CSharp.Scripting": "3.4.0", + "System.Reactive": "5.0.0" + } + }, + "Avalonia.ReactiveUI": { + "type": "Direct", + "requested": "[0.10.13, )", + "resolved": "0.10.13", + "contentHash": "s5UUJ/MG97Jv9i+kxlgNSKx8Q6uJkgYMJ/LdOR3VM+7T32IRyhuxrNNCYygqk6avuJ4QqvMLU02T6v3GhI7WWA==", + "dependencies": { + "Avalonia": "0.10.13", + "ReactiveUI": "13.2.10", + "System.Reactive": "5.0.0" + } + }, + "ReactiveUI": { + "type": "Direct", + "requested": "[17.1.50, )", + "resolved": "17.1.50", + "contentHash": "UofZH1WMwWNLvFkK2SH+gsYTkUmhFFJO0Pix9YG2RzdHQ92mRFCzHzPO1abeU8/cxzyc9hJHX7sBChzUj53Ulg==", + "dependencies": { + "DynamicData": "7.5.2", + "Splat": "14.1.45" + } + }, + "Avalonia.Angle.Windows.Natives": { + "type": "Transitive", + "resolved": "2.1.0.2020091801", + "contentHash": "nGsCPI8FuUknU/e6hZIqlsKRDxClXHZyztmgM8vuwslFC/BIV3LqM2wKefWbr6SORX4Lct4nivhSMkdF/TrKgg==" + }, + "Avalonia.Controls.DataGrid": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "51xcaYtJN41vX/4xUu8rNyoISTO4bdswpfZmTPjeBTdofrhZ6mzOqbxVk6tqT4gt88MPihbaPil4jsD4X4Aixw==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Remote.Protocol": "0.10.13", + "JetBrains.Annotations": "10.3.0", + "System.Reactive": "5.0.0" + } + }, + "Avalonia.Controls.PanAndZoom": { + "type": "Transitive", + "resolved": "10.12.0", + "contentHash": "ns+2tJTXTpNzNA9YV2mjR4EJOZl2vBFWnGUTSIl/vyOQMrrU5CbsXQxy2MFBvW0vGrRTlw80nUtBnsT759kwKQ==", + "dependencies": { + "Avalonia": "0.10.12" + } + }, + "Avalonia.FreeDesktop": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "/bKzscse/kY4RNMFk8r/jqLY/kS0fSkwp4TpqEF4UJeI8sHUvwe4yecnzNb1qDP9tCX4S6ML38LklAIqAk8gIQ==", + "dependencies": { + "Avalonia": "0.10.13", + "Tmds.DBus": "0.9.0" + } + }, + "Avalonia.Native": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "pq3WiiOyFyhJHnYdxP/fOlcG9DfqhJ0W5CCfPX48QyOdODbPgMF5LY6BU+McDpeAJTwQ4LqVfznHZoCeHH12gg==", + "dependencies": { + "Avalonia": "0.10.13" + } + }, + "Avalonia.Remote.Protocol": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "hnklCHyLCMrzWjMc3T0mYkRKdfUqpw2qCkf9HBRzyqnI6uG5tLw2QIlRF9zYC4BGOpx/B/647IcIjgq6H1ypzQ==" + }, + "Avalonia.Skia": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "aG0JlUhCpwGM/QsN/+rRak7XlPy0Jtd5HaiCdYKtuBOc+ISGs6hmCJDKjklNANp9gZR/TUUgXkqk5VFMQUJkTA==", + "dependencies": { + "Avalonia": "0.10.13", + "HarfBuzzSharp": "2.8.2-preview.178", + "HarfBuzzSharp.NativeAssets.Linux": "2.8.2-preview.178", + "HarfBuzzSharp.NativeAssets.WebAssembly": "2.8.2-preview.178", + "SkiaSharp": "2.88.0-preview.178", + "SkiaSharp.NativeAssets.Linux": "2.88.0-preview.178", + "SkiaSharp.NativeAssets.WebAssembly": "2.88.0-preview.178" + } + }, + "Avalonia.Svg.Skia": { + "type": "Transitive", + "resolved": "0.10.12", + "contentHash": "qsXKdm5eWpfoVPe0xgtxhbOYlhG8QdbYNJZTTihg/c4iPFYuh1G7DldiNskuVFuGiGxLVZ0g6ebql7ZkwbO1pA==", + "dependencies": { + "Avalonia": "0.10.12", + "Avalonia.Skia": "0.10.12", + "SkiaSharp": "2.88.0-preview.178", + "Svg.Skia": "0.5.12" + } + }, + "Avalonia.Win32": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "CNUGWafAonBYYbHMliujDrs4JH2giH435GxU+O1q/nGyO5Mm+PXCG4NYsg+0zwp8yQBapFK7eYwzamU+re+cDw==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Angle.Windows.Natives": "2.1.0.2020091801", + "System.Drawing.Common": "4.5.0", + "System.Numerics.Vectors": "4.5.0" + } + }, + "Avalonia.X11": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "kXxn79KVB0ZfeZqQL7c2Dlvl96GBlRT8rzAh6g/j0hcgykQ55/e0be8Te6+Ny7hI+tFrob6lxvYdxYVUUCjHYg==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.FreeDesktop": "0.10.13", + "Avalonia.Skia": "0.10.13" + } + }, + "Avalonia.Xaml.Behaviors": { + "type": "Transitive", + "resolved": "0.10.13.2", + "contentHash": "sZlq6FFzNNzYmHK+vARWFpxtDY4XUdnU6q6zVIm4l1iQ3/ZXor4SeUnYDdd3lFZtoJ9yc8K2g4X7d/lVEgV9tA==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Xaml.Interactions": "0.10.13.2", + "Avalonia.Xaml.Interactivity": "0.10.13.2" + } + }, + "Avalonia.Xaml.Interactions": { + "type": "Transitive", + "resolved": "0.10.13.2", + "contentHash": "bMgr5NtEjJ/qvf+1JD4T4rRt9AbZNnJdYCx5cBfGyXHETbeliTJAt07mqTahcoPY1G2FskF1OSIW5ytljbviLw==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Xaml.Interactivity": "0.10.13.2" + } + }, + "Avalonia.Xaml.Interactivity": { + "type": "Transitive", + "resolved": "0.10.13.2", + "contentHash": "OIjK5XCsUrBCqog8lxI/DEbubaNQRwy8e8Px4i3dvllomU28EYsJm4XtrPVakY7MC+we825uXY47tsO/benLug==", + "dependencies": { + "Avalonia": "0.10.13" + } + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "4.2.0", + "contentHash": "1TtKHYYVfox7aUZ0akCqkULmAjpG8X5ZRzTzTiONY34xtvvaPuUSSdVL1VaF/1/ljRhOkpy+uKOGn6XoFGvorw==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.TypeConverter": "4.3.0", + "System.Diagnostics.TraceSource": "4.3.0", + "System.Dynamic.Runtime": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + }, + "DynamicData": { + "type": "Transitive", + "resolved": "7.5.4", + "contentHash": "1OpHPoyQGzHREiP6JXnPaBBx4KWVQZW7zBAZpKXc9kl4rcbEK4fo2/T3bDXZbHWKhDqVAISW9pE4Ug9+ms3RoA==", + "dependencies": { + "System.Reactive": "5.0.0" + } + }, + "EmbedIO": { + "type": "Transitive", + "resolved": "3.4.3", + "contentHash": "YM6hpZNAfvbbixfG9T4lWDGfF0D/TqutbTROL4ogVcHKwPF1hp+xS3ABwd3cxxTxvDFkj/zZl57QgWuFA8Igxw==", + "dependencies": { + "Unosquare.Swan.Lite": "3.0.0" + } + }, + "Fizzler": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "CPxuWF8EPvM0rwAtMTR5G+7EuLoGNXsEfqyx06upN9JyVALZ73KgbGn3SLFwGosifiUAXrvNHtXlUwGGytdECg==" + }, + "FluentAvaloniaUI": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "xzcsuOswakMpz/EdA59NEOgaCtZ/9zsd5QWTB0YYQqSv1GF95Uk2aMVtO5gtfNrCT4lZvGNWVf3HGjYz9cHovQ==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Desktop": "0.10.13", + "Avalonia.Diagnostics": "0.10.13", + "MicroCom.CodeGenerator.MSBuild": "0.10.4", + "MicroCom.Runtime": "0.10.4" + } + }, + "Flurl": { + "type": "Transitive", + "resolved": "3.0.2", + "contentHash": "1/6mqdzGCTdAekbWkVZBTylCV+8g3JUSTXRBngRVR274S+RsAYNRF79GbDoDsPfMKu8VPc9HkQWdBEAncK1PQQ==" + }, + "Flurl.Http": { + "type": "Transitive", + "resolved": "3.2.0", + "contentHash": "5S8YiJm5CyRFO418GG9PDrsgmGEaZJtZLUqk3xqBKrfx7W9eKtOSpeji/GwAL+tSgNTALKBPvBKTaT4S83Oo+w==", + "dependencies": { + "Flurl": "3.0.2", + "Newtonsoft.Json": "12.0.2", + "System.Text.Encoding.CodePages": "4.5.1" + } + }, + "HarfBuzzSharp": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "OUir5qn95QRtlc8RWKfU/63xYwtuAbylL2oAj3eBWgAsVoWnFrEv+Oh1sj0xjW7mogFGaeGtY40lqAD1srWJcQ==", + "dependencies": { + "HarfBuzzSharp.NativeAssets.Win32": "2.8.2-preview.178", + "HarfBuzzSharp.NativeAssets.macOS": "2.8.2-preview.178", + "System.Memory": "4.5.3" + } + }, + "HarfBuzzSharp.NativeAssets.Linux": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "4scihdELcRpCEubBsUMHUJn93Xvx6ASj596WfO9y8CEuFNW0LBMDL71HBCyq5zXsn8HyGjLtoBLW0PpXbVnpjQ==", + "dependencies": { + "HarfBuzzSharp": "2.8.2-preview.178" + } + }, + "HarfBuzzSharp.NativeAssets.macOS": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "QtmAs62il4vFtt3fFOXhhPDl7TX+NGu4tFB5qmnqUn+EnSJW7mxqNk1n9I7+Z2ORym0nTP4dhcRNtOpOS7Oenw==" + }, + "HarfBuzzSharp.NativeAssets.WebAssembly": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "+S8qtBAVTrt+E85jZXPxYthUgSUq7iB6UZ0v0WFsy9gWhZ/hVE3hZJpcgeywT9H/SRX3ZIX+qzpKJlOM+mUcNA==" + }, + "HarfBuzzSharp.NativeAssets.Win32": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "EgeF5uCZcAriIHmWq3hKNxz/jBJLeP/PKU4yI87UNkJCt4hYignOMjY0irl/rGVZtTL/G05xxf7TB6sjisi8sQ==" + }, + "HidSharp": { + "type": "Transitive", + "resolved": "2.1.0", + "contentHash": "UTdxWvbgp2xzT1Ajaa2va+Qi3oNHJPasYmVhbKI2VVdu1VYP6yUG+RikhsHvpD7iM0S8e8UYb5Qm/LTWxx9QAA==" + }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.11.10", + "contentHash": "4TBsHSXPocdsEB5dewIHeKykTzIz5Ui7ouXw4JsUGI+ax4jjviVJVD7+gsPCNyA+b3de2EjYI+jcEq8I/1ZFSQ==" + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "10.3.0", + "contentHash": "0GLU9lwGVXjUNlr9ZIdAgjqLI2Zm/XFGJFaqJ1T1sU+kwfeMLhm68+rblUrNUP9psRl4i8yM7Ghb4ia4oI2E5g==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "LiteDB": { + "type": "Transitive", + "resolved": "5.0.11", + "contentHash": "6cL4bOmVCUB0gIK+6qIr68HeqjjHZicPDGQjvJ87mIOvkFsEsJWkIps3yoKNeLpHhJQur++yoQ9Q8gxsdos0xQ==" + }, + "Live.Avalonia": { + "type": "Transitive", + "resolved": "1.3.1", + "contentHash": "FIzh7k2PWsgIBjS4no51ZzWxYmzTG/RzC0DUO6PzoiKkqyKpvSpOvcRg+41Roz6X8VnYCIVm61R7TFlT4eUFKA==", + "dependencies": { + "Avalonia": "0.10.0" + } + }, + "Material.Icons": { + "type": "Transitive", + "resolved": "1.0.2", + "contentHash": "4UIT91QbedjNfUYU+R3T60U+InozFtIsP1iUzGbkq/G0f1eDE3tXMWUuLEDO3yCEP2MHrPjAOpokwqk1rnWNGA==", + "dependencies": { + "Newtonsoft.Json": "12.0.3" + } + }, + "Material.Icons.Avalonia": { + "type": "Transitive", + "resolved": "1.0.2", + "contentHash": "hK0MQm2XyPwjT+DiviDOBjrJVQe6V0u+XTDVbxohkq58hUBlq0XZXmHHZ27jUJU6ZVP9ybu44aXfWycbVjnY2A==", + "dependencies": { + "Avalonia": "0.10.0", + "Material.Icons": "1.0.2" + } + }, + "McMaster.NETCore.Plugins": { + "type": "Transitive", + "resolved": "1.4.0", + "contentHash": "UKw5Z2/QHhkR7kiAJmqdCwVDMQV0lwsfj10+FG676r8DsJWIpxtachtEjE0qBs9WoK5GUQIqxgyFeYUSwuPszg==", + "dependencies": { + "Microsoft.DotNet.PlatformAbstractions": "3.1.6", + "Microsoft.Extensions.DependencyModel": "5.0.0" + } + }, + "MicroCom.CodeGenerator.MSBuild": { + "type": "Transitive", + "resolved": "0.10.4", + "contentHash": "aG1kLtkgX6lC8qpxVon4OFSCdWYEbQubIg+2/ychWTIFTrDHWFkhcC4YTn0IfGiVCLwh0Yj7eSc8nk5f3UoMKg==" + }, + "MicroCom.Runtime": { + "type": "Transitive", + "resolved": "0.10.4", + "contentHash": "enc2U+/1UnF3rtocxb5ofcg7cJSmJI4adbYPr8DZa5bQzvhqA/VbjlcalxoqjI3CR2RvM5WWpjKT0p3BriFJjw==" + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "2.9.6", + "contentHash": "Kmms3TxGQMNb95Cu/3K+0bIcMnV4qf/phZBLAB0HUi65rBPxP4JO3aM2LoAcb+DFS600RQJMZ7ZLyYDTbLwJOQ==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "3.4.0", + "contentHash": "3ncA7cV+iXGA1VYwe2UEZXcvWyZSlbexWjM9AvocP7sik5UD93qt9Hq0fMRGk0jFRmvmE4T2g+bGfXiBVZEhLw==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "2.9.6", + "System.Collections.Immutable": "1.5.0", + "System.Memory": "4.5.3", + "System.Reflection.Metadata": "1.6.0", + "System.Runtime.CompilerServices.Unsafe": "4.5.2", + "System.Text.Encoding.CodePages": "4.5.1", + "System.Threading.Tasks.Extensions": "4.5.3" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "3.4.0", + "contentHash": "/LsTtgcMN6Tu1oo7/WYbRAHL4/ubXC/miEakwTpcZKJKtFo7D0AK95Hw0dbGxul6C8WJu60v6NP2435TDYZM+Q==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[3.4.0]" + } + }, + "Microsoft.CodeAnalysis.CSharp.Scripting": { + "type": "Transitive", + "resolved": "3.4.0", + "contentHash": "tLgqc76qXHmONUhWhxo7z3TcL/LmGFWIUJm1exbQmVJohuQvJnejUMxmVkdxDfMuMZU1fIyJXPZ6Fkp4FEneAg==", + "dependencies": { + "Microsoft.CSharp": "4.3.0", + "Microsoft.CodeAnalysis.CSharp": "[3.4.0]", + "Microsoft.CodeAnalysis.Common": "[3.4.0]", + "Microsoft.CodeAnalysis.Scripting.Common": "[3.4.0]" + } + }, + "Microsoft.CodeAnalysis.Scripting.Common": { + "type": "Transitive", + "resolved": "3.4.0", + "contentHash": "+b6I3DZL2zvck+B/E/aiOveakj5U2G2BcYODQxcGh2IDbatNU3XXxGT1HumkWB5uIZI2Leu0opBgBpjScmjGMA==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[3.4.0]" + } + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "P+MBhIM0YX+JqROuf7i306ZLJEjQYA9uUyRDE+OqwUI5sh41e2ZbPQV3LfAPh+29cmceE1pUffXsGfR4eMY3KA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Dynamic.Runtime": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "Microsoft.DotNet.PlatformAbstractions": { + "type": "Transitive", + "resolved": "3.1.6", + "contentHash": "jek4XYaQ/PGUwDKKhwR8K47Uh1189PFzMeLqO83mXrXQVIpARZCcfuDedH50YDTepBkfijCZN5U/vZi++erxtg==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "umBECCoMC+sOUgm083yFr8SxTobUOcPFH4AXigdO2xJiszCHAnmeDl4qPphJt+oaJ/XIfV1wOjIts2nRnki61Q==" + }, + "Microsoft.Extensions.ObjectPool": { + "type": "Transitive", + "resolved": "5.0.9", + "contentHash": "grj0e6Me0EQsgaurV0fxP0xd8sz8eZVK+Jb816DPzNADHaqXaXJD3xZX9SFjyDl3ykAYvD0y77o5vRd9Hzsk9g==" + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "LuI1oG+24TUj1ZRQQjM5Ew73BKnZE5NZ/7eAdh1o8ST5dPhUnJvIkiIn2re3MwnkRy6ELRnvEbBxHP8uALKhJw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "Ninject": { + "type": "Transitive", + "resolved": "3.3.4", + "contentHash": "CmbWW97FfJuh4LEOVZM/spqXl4KAulRUjqeMwRd5J9rDMQArmIYaDMU3pyzXXHT062tbF0OPIMwI7tSOtprPfg==", + "dependencies": { + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0" + } + }, + "Ninject.Extensions.ChildKernel": { + "type": "Transitive", + "resolved": "3.3.0", + "contentHash": "vl/p3f8sIaCCHiKsjhq9R8n3bH705Hu1WJXNpMEz1UC79EV51Mk5TWYXQbRnsK20hxF48CiAgUBb9pMKfX6sLw==", + "dependencies": { + "Ninject": "3.3.4" + } + }, + "Ninject.Extensions.Conventions": { + "type": "Transitive", + "resolved": "3.3.0", + "contentHash": "bAMK7tRHIRQ+gjR1WxwTlNuP+/bKRIFf6NKObkWP3XVzFQhsLEKA0hEo73OXuBdpng0jczhqCGmwu630nIa/bg==", + "dependencies": { + "Ninject.Extensions.Factory": "3.3.2" + } + }, + "Ninject.Extensions.Factory": { + "type": "Transitive", + "resolved": "3.3.2", + "contentHash": "H9s77i9WsbgF6s7OieQ+c51KoW90jJAQqb0ClEqi6SBtL7jySUjh/5HCjnYgyQ8iYcWhvhw9cFnYxX9CB1kL7Q==", + "dependencies": { + "Castle.Core": "4.2.0", + "Ninject": "3.3.3" + } + }, + "NoStringEvaluating": { + "type": "Transitive", + "resolved": "2.2.2", + "contentHash": "hJHivPDA1Vxn0CCgOtHKZ3fmldxQuz7VL1J4lEaPTXCf+Vwcx1FDf05mGMh6olYMSxoKimGX8YK2sEoqeH3pnA==", + "dependencies": { + "Microsoft.Extensions.ObjectPool": "5.0.9" + } + }, + "ReactiveUI.Validation": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "rhEphZ4ErbGfNtbBQ/tYMsLJYHyLVyqidU+sgZ3kXKbS7QrNoM4j6PPxCwLMKsJUuvVL8JN45xgmB9tSwm7+lg==", + "dependencies": { + "ReactiveUI": "16.2.6" + } + }, + "RGB.NET.Core": { + "type": "Transitive", + "resolved": "1.0.0-prerelease7", + "contentHash": "IIja5sC4QZ5pbSNckRCG7TlY4U6j/dRbrl4e2FZqsTGgsevaVB3IqonUQLFY1GGst4xNSl2oh0A23coXQxXGbQ==" + }, + "RGB.NET.Layout": { + "type": "Transitive", + "resolved": "1.0.0-prerelease7", + "contentHash": "S0kfWVa8EfMOAl2WPHsq98dwaO+SNz9TWr1AtMkdo8aZuYIVhaJ1c+mSAMMnH1V+mSbxDWPHWkNzi9ITszJucA==", + "dependencies": { + "RGB.NET.Core": "1.0.0-prerelease7" + } + }, + "RGB.NET.Presets": { + "type": "Transitive", + "resolved": "1.0.0-prerelease7", + "contentHash": "NgShvOPQM0miOsdqMKjkNunngJUZMwr8KR8ME2/Ksir7wgIQfgJj1YwZy8aIj+ar7fDo6VZJZenAshs/Ul+04A==", + "dependencies": { + "RGB.NET.Core": "1.0.0-prerelease7" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "Serilog": { + "type": "Transitive", + "resolved": "2.10.0", + "contentHash": "+QX0hmf37a0/OZLxM3wL7V6/ADvC1XihXN4Kq/p6d8lCPfgkRdiuhbWlMaFjR9Av0dy5F0+MBeDmDdRZN/YwQA==" + }, + "Serilog.Sinks.Console": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "apLOvSJQLlIbKlbx+Y2UDHSP05kJsV7mou+fvJoRGs/iR+jC22r8cuFVMjjfVxz/AD4B2UCltFhE1naRLXwKNw==", + "dependencies": { + "Serilog": "2.10.0" + } + }, + "Serilog.Sinks.Debug": { + "type": "Transitive", + "resolved": "2.0.0", + "contentHash": "Y6g3OBJ4JzTyyw16fDqtFcQ41qQAydnEvEqmXjhwhgjsnG/FaJ8GUqF5ldsC/bVkK8KYmqrPhDO+tm4dF6xx4A==", + "dependencies": { + "Serilog": "2.10.0" + } + }, + "Serilog.Sinks.File": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==", + "dependencies": { + "Serilog": "2.10.0" + } + }, + "ShimSkiaSharp": { + "type": "Transitive", + "resolved": "0.5.12", + "contentHash": "oUGM7gQHRzbGPRs3E1pe5e8VwML21YyEz9xdo+r2ov1mAqSDPyXErVQP6pN4gnfYMVf5ADR7BVkVzt4R9Iz3gQ==" + }, + "SkiaSharp": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "arzd/44ykiBPqGWUuQqNTuJ49rhsXOg4Zw1p2Mm3B/5PZzV1wcTH4V+J+4ra8RS0KbIoy4KWeNF+zHAifNsiRg==", + "dependencies": { + "SkiaSharp.NativeAssets.Win32": "2.88.0-preview.178", + "SkiaSharp.NativeAssets.macOS": "2.88.0-preview.178", + "System.Memory": "4.5.3" + } + }, + "SkiaSharp.HarfBuzz": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "qTf3PbRJsTVOttQkYWOCswa1QnkH0dEOqMSgr3iXZQuKPNlj1qpGY8+OGPs25WKgUEqOpv2nog/AYQ/bpyOXzA==", + "dependencies": { + "HarfBuzzSharp": "2.8.2-preview.178", + "SkiaSharp": "2.88.0-preview.178" + } + }, + "SkiaSharp.NativeAssets.Linux": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "nc9C8zGvL2G7p0lcTPhN4EOt2Mozv6KLJinMwjF97sYoI5cpkXCPZSRTcyf8k49gAZaOd+UMGaygCAz/8vaaWg==", + "dependencies": { + "SkiaSharp": "2.88.0-preview.178" + } + }, + "SkiaSharp.NativeAssets.macOS": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "+Hs3ku4buimzBHuc8FoyjOcE6eU5r98zcG7WH/s+doYQ1bFIjk+dKfqthgZ2o0NRAv8D3esq9rWrZTj12q+m1w==" + }, + "SkiaSharp.NativeAssets.WebAssembly": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "u4Ss81oOlx0dhu5fxl4vK5f2Hm7psHDUSAoQValNV/BmixsW4TkETE3dOnHNRWwI56++tRG9dK33HimZDUrUpw==" + }, + "SkiaSharp.NativeAssets.Win32": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "9og9GCkdZc/NYrmbsRzohmIBRlS1oFegJiBMsoG93qYjhh2o6q5QBYxd61zw5Mgeytl3qj4YM+6BNIF4tcF+6w==" + }, + "Splat": { + "type": "Transitive", + "resolved": "14.1.45", + "contentHash": "ayHdfTUklD5ci0s9m4uYMccjtkKVjZ9fVPT5q3PN+SnvyD6bjQVRozOfUHwdwh4LAz9ETZjR/tAgrm+IapXKrw==" + }, + "Splat.Ninject": { + "type": "Transitive", + "resolved": "14.1.45", + "contentHash": "aU851Yb7i4kLzzrpo3KxFZg/U0vd36ORza9nk51pvL/QE+Jkm3ROqoPMf+BPfugEub2J1hHDEuLKJtxU7TAt0w==", + "dependencies": { + "Ninject": "3.3.4", + "Splat": "14.1.45" + } + }, + "Svg.Custom": { + "type": "Transitive", + "resolved": "0.5.12", + "contentHash": "kmjLQf5U5WC7tRGBedUhtrOUCR0NaNL2auzOA2a/oMwEA0Bjrpd6qvMTpJUS3HITxi8vJazGl270K+i0JvdJog==", + "dependencies": { + "Fizzler": "1.2.0", + "System.Memory": "4.5.3", + "System.ObjectModel": "4.3.0", + "System.ValueTuple": "4.5.0" + } + }, + "Svg.Model": { + "type": "Transitive", + "resolved": "0.5.12", + "contentHash": "/CPiXIugg4oVyYlQr26fB1X9iQfICALF8AJXbTWnXGoP2WZa1t6aZbAXPk3HoPApA0w5waf3XXkBiYYnWwawaQ==", + "dependencies": { + "ShimSkiaSharp": "0.5.12", + "Svg.Custom": "0.5.12" + } + }, + "Svg.Skia": { + "type": "Transitive", + "resolved": "0.5.12", + "contentHash": "KjKpjz0FKge+WpRzjD1bqywAW3vZhXwpR5c7Ej5OuP4xDrQjBwtFeB0iZ+yEJMzwXf/Rs4ImuN8m3bmBDJvMHg==", + "dependencies": { + "SkiaSharp": "2.88.0-preview.178", + "SkiaSharp.HarfBuzz": "2.88.0-preview.178", + "Svg.Custom": "0.5.12", + "Svg.Model": "0.5.12" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "1.5.0", + "contentHash": "EXKiDFsChZW0RjrZ4FYHu9aW6+P4MCgEDCklsVseRfhoO0F+dXeMSsMRAlVXIo06kGJ/zv+2w1a2uc2+kxxSaQ==" + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", + "dependencies": { + "System.Collections.NonGeneric": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==", + "dependencies": { + "System.ComponentModel": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "16pQ6P+EdhcXzPiEK4kbA953Fu0MNG2ovxTZU81/qsCd1zPRsKc3uif5NgvllCY598k6bI0KUyKW8fanlfaDQg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.NonGeneric": "4.3.0", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.Primitives": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VnYp1NxGx8Ww731y2LJ1vpfb/DKVNKEZ8Jsh5SgQTZREL/YpWRArgh9pI8CDLmgHspZmLL697CaLvH85qQpRiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "AiJFxxVPdeITstiRS5aAu8+8Dpf5NawTMoapZ53Gfirml24p7HIfhjmCRxdXnmmf3IUA3AX3CcW7G73CjWxW/Q==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0", + "Microsoft.Win32.SystemEvents": "4.5.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SNVi1E/vfWUAs/WYKhE9+qlS6KqK0YVhnlT0HQtr8pMIA8YX3lwy3uPMownDwdYISBdmAF/2holEIldVp85Wag==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.3", + "contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reactive": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==" + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VR4kk8XLKebQ4MZuKuIni/7oh+QGFmZW3qORd1GvBq/8026OpW501SzT/oypwiQl4TvT8ErnReh/NzY9u+C6wQ==" + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "HxozeSlipUK7dAroTYwIcGwKDeOVpQnJlpVaOkBz7CM4TsE5b/tKlQBZecTjh6FzcSbxndYaxxpsBMz+wMJeyw==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Runtime.CompilerServices.Unsafe": "4.5.2" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.3", + "contentHash": "+MvhNtcvIbqmhANyKu91jQnvIRVSTiaOiFNfKWwXGHG48YAb4I/TyH8spsySiPYla7gKal5ZnF3teJqZAximyQ==" + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.ValueTuple": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "Tmds.DBus": { + "type": "Transitive", + "resolved": "0.9.0", + "contentHash": "KcTWL9aKuob9Qo2sOTTKFePs1rKGTwZrcBvMFuGVIVR5RojX3oIFj5UBLYfSGjYgrcImC7LjQI3DdCFwUnhNXw==", + "dependencies": { + "System.Reflection.Emit": "4.7.0", + "System.Security.Principal.Windows": "4.7.0" + } + }, + "Unosquare.Swan.Lite": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "noPwJJl1Q9uparXy1ogtkmyAPGNfSGb0BLT1292nFH1jdMKje6o2kvvrQUvF9Xklj+IoiAI0UzF6Aqxlvo10lw==" + }, + "artemis.core": { + "type": "Project", + "dependencies": { + "Artemis.Storage": "1.0.0", + "EmbedIO": "3.4.3", + "HidSharp": "2.1.0", + "Humanizer.Core": "2.11.10", + "LiteDB": "5.0.11", + "McMaster.NETCore.Plugins": "1.4.0", + "Newtonsoft.Json": "13.0.1", + "Ninject": "3.3.4", + "Ninject.Extensions.ChildKernel": "3.3.0", + "Ninject.Extensions.Conventions": "3.3.0", + "RGB.NET.Core": "1.0.0-prerelease7", + "RGB.NET.Layout": "1.0.0-prerelease7", + "RGB.NET.Presets": "1.0.0-prerelease7", + "Serilog": "2.10.0", + "Serilog.Sinks.Console": "4.0.1", + "Serilog.Sinks.Debug": "2.0.0", + "Serilog.Sinks.File": "5.0.0", + "SkiaSharp": "2.88.0-preview.178", + "System.Buffers": "4.5.1", + "System.IO.FileSystem.AccessControl": "5.0.0", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.Metadata": "5.0.0", + "System.ValueTuple": "4.5.0" + } + }, + "artemis.storage": { + "type": "Project", + "dependencies": { + "LiteDB": "5.0.11", + "Serilog": "2.10.0" + } + }, + "artemis.ui": { + "type": "Project", + "dependencies": { + "Artemis.Core": "1.0.0", + "Artemis.UI.Shared": "1.0.0", + "Artemis.VisualScripting": "1.0.0", + "Avalonia": "0.10.13", + "Avalonia.Controls.PanAndZoom": "10.12.0", + "Avalonia.Desktop": "0.10.13", + "Avalonia.Diagnostics": "0.10.13", + "Avalonia.ReactiveUI": "0.10.13", + "Avalonia.Svg.Skia": "0.10.12", + "Avalonia.Xaml.Behaviors": "0.10.13.2", + "DynamicData": "7.5.4", + "FluentAvaloniaUI": "1.3.0", + "Flurl.Http": "3.2.0", + "Live.Avalonia": "1.3.1", + "Material.Icons.Avalonia": "1.0.2", + "RGB.NET.Core": "1.0.0-prerelease7", + "RGB.NET.Layout": "1.0.0-prerelease7", + "ReactiveUI": "17.1.50", + "ReactiveUI.Validation": "2.2.1", + "SkiaSharp": "2.88.0-preview.178", + "Splat.Ninject": "14.1.45" + } + }, + "artemis.ui.shared": { + "type": "Project", + "dependencies": { + "Artemis.Core": "1.0.0", + "Avalonia": "0.10.13", + "Avalonia.ReactiveUI": "0.10.13", + "Avalonia.Svg.Skia": "0.10.12", + "Avalonia.Xaml.Behaviors": "0.10.13.2", + "DynamicData": "7.5.4", + "FluentAvaloniaUI": "1.3.0", + "Material.Icons.Avalonia": "1.0.2", + "RGB.NET.Core": "1.0.0-prerelease7", + "ReactiveUI": "17.1.50", + "ReactiveUI.Validation": "2.2.1", + "SkiaSharp": "2.88.0-preview.178" + } + }, + "artemis.visualscripting": { + "type": "Project", + "dependencies": { + "Artemis.Core": "1.0.0", + "Artemis.UI.Shared": "1.0.0", + "Avalonia": "0.10.13", + "Avalonia.ReactiveUI": "0.10.13", + "Avalonia.Xaml.Behaviors": "0.10.13.2", + "Ninject": "3.3.4", + "NoStringEvaluating": "2.2.2", + "ReactiveUI": "17.1.50", + "SkiaSharp": "2.88.0-preview.178" + } + } + } + } +} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.MacOS/.gitignore b/src/Artemis.UI.MacOS/.gitignore similarity index 100% rename from src/Avalonia/Artemis.UI.MacOS/.gitignore rename to src/Artemis.UI.MacOS/.gitignore diff --git a/src/Avalonia/Artemis.UI.MacOS/App.axaml b/src/Artemis.UI.MacOS/App.axaml similarity index 100% rename from src/Avalonia/Artemis.UI.MacOS/App.axaml rename to src/Artemis.UI.MacOS/App.axaml diff --git a/src/Avalonia/Artemis.UI.MacOS/App.axaml.cs b/src/Artemis.UI.MacOS/App.axaml.cs similarity index 100% rename from src/Avalonia/Artemis.UI.MacOS/App.axaml.cs rename to src/Artemis.UI.MacOS/App.axaml.cs diff --git a/src/Avalonia/Artemis.UI.MacOS/Artemis.UI.MacOS.csproj b/src/Artemis.UI.MacOS/Artemis.UI.MacOS.csproj similarity index 90% rename from src/Avalonia/Artemis.UI.MacOS/Artemis.UI.MacOS.csproj rename to src/Artemis.UI.MacOS/Artemis.UI.MacOS.csproj index 40039f1d5..fce1bf446 100644 --- a/src/Avalonia/Artemis.UI.MacOS/Artemis.UI.MacOS.csproj +++ b/src/Artemis.UI.MacOS/Artemis.UI.MacOS.csproj @@ -4,6 +4,7 @@ net6.0 enable x64 + x64 @@ -18,7 +19,7 @@ - + \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.MacOS/Assets/avalonia-logo.ico b/src/Artemis.UI.MacOS/Assets/avalonia-logo.ico similarity index 100% rename from src/Avalonia/Artemis.UI.MacOS/Assets/avalonia-logo.ico rename to src/Artemis.UI.MacOS/Assets/avalonia-logo.ico diff --git a/src/Avalonia/Artemis.UI.MacOS/Program.cs b/src/Artemis.UI.MacOS/Program.cs similarity index 100% rename from src/Avalonia/Artemis.UI.MacOS/Program.cs rename to src/Artemis.UI.MacOS/Program.cs diff --git a/src/Artemis.UI.MacOS/packages.lock.json b/src/Artemis.UI.MacOS/packages.lock.json new file mode 100644 index 000000000..66c4330a9 --- /dev/null +++ b/src/Artemis.UI.MacOS/packages.lock.json @@ -0,0 +1,1828 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Avalonia": { + "type": "Direct", + "requested": "[0.10.13, )", + "resolved": "0.10.13", + "contentHash": "7st8nMai1C1nqw1a2H+zXiVYTnnfFwZz7JGziEzJK4sF6+x/W77XkdcDgDHyihcK3clQZJexYr4f+PzK4BJhSQ==", + "dependencies": { + "Avalonia.Remote.Protocol": "0.10.13", + "JetBrains.Annotations": "10.3.0", + "System.ComponentModel.Annotations": "4.5.0", + "System.Memory": "4.5.3", + "System.Reactive": "5.0.0", + "System.Runtime.CompilerServices.Unsafe": "4.6.0", + "System.ValueTuple": "4.5.0" + } + }, + "Avalonia.Desktop": { + "type": "Direct", + "requested": "[0.10.13, )", + "resolved": "0.10.13", + "contentHash": "v+siRNQYvSZR9lt/bBgb81t6LGbSC7pUo+APgPmKYGLeYcMij1O6CWk7tCh9hihMxNHYw/PEB06r8ZBQIg9YPg==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Native": "0.10.13", + "Avalonia.Skia": "0.10.13", + "Avalonia.Win32": "0.10.13", + "Avalonia.X11": "0.10.13" + } + }, + "Avalonia.Diagnostics": { + "type": "Direct", + "requested": "[0.10.13, )", + "resolved": "0.10.13", + "contentHash": "stIGj0Rv/p/Re0GqlXCc061paifG6wT0YvrTUV/fQloNctW8Y4sf1xZNzr9dxdSz6+LG2AZjdZcSUhUGOCe6Zg==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Controls.DataGrid": "0.10.13", + "Microsoft.CodeAnalysis.CSharp.Scripting": "3.4.0", + "System.Reactive": "5.0.0" + } + }, + "Avalonia.ReactiveUI": { + "type": "Direct", + "requested": "[0.10.13, )", + "resolved": "0.10.13", + "contentHash": "s5UUJ/MG97Jv9i+kxlgNSKx8Q6uJkgYMJ/LdOR3VM+7T32IRyhuxrNNCYygqk6avuJ4QqvMLU02T6v3GhI7WWA==", + "dependencies": { + "Avalonia": "0.10.13", + "ReactiveUI": "13.2.10", + "System.Reactive": "5.0.0" + } + }, + "ReactiveUI": { + "type": "Direct", + "requested": "[17.1.50, )", + "resolved": "17.1.50", + "contentHash": "UofZH1WMwWNLvFkK2SH+gsYTkUmhFFJO0Pix9YG2RzdHQ92mRFCzHzPO1abeU8/cxzyc9hJHX7sBChzUj53Ulg==", + "dependencies": { + "DynamicData": "7.5.2", + "Splat": "14.1.45" + } + }, + "Avalonia.Angle.Windows.Natives": { + "type": "Transitive", + "resolved": "2.1.0.2020091801", + "contentHash": "nGsCPI8FuUknU/e6hZIqlsKRDxClXHZyztmgM8vuwslFC/BIV3LqM2wKefWbr6SORX4Lct4nivhSMkdF/TrKgg==" + }, + "Avalonia.Controls.DataGrid": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "51xcaYtJN41vX/4xUu8rNyoISTO4bdswpfZmTPjeBTdofrhZ6mzOqbxVk6tqT4gt88MPihbaPil4jsD4X4Aixw==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Remote.Protocol": "0.10.13", + "JetBrains.Annotations": "10.3.0", + "System.Reactive": "5.0.0" + } + }, + "Avalonia.Controls.PanAndZoom": { + "type": "Transitive", + "resolved": "10.12.0", + "contentHash": "ns+2tJTXTpNzNA9YV2mjR4EJOZl2vBFWnGUTSIl/vyOQMrrU5CbsXQxy2MFBvW0vGrRTlw80nUtBnsT759kwKQ==", + "dependencies": { + "Avalonia": "0.10.12" + } + }, + "Avalonia.FreeDesktop": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "/bKzscse/kY4RNMFk8r/jqLY/kS0fSkwp4TpqEF4UJeI8sHUvwe4yecnzNb1qDP9tCX4S6ML38LklAIqAk8gIQ==", + "dependencies": { + "Avalonia": "0.10.13", + "Tmds.DBus": "0.9.0" + } + }, + "Avalonia.Native": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "pq3WiiOyFyhJHnYdxP/fOlcG9DfqhJ0W5CCfPX48QyOdODbPgMF5LY6BU+McDpeAJTwQ4LqVfznHZoCeHH12gg==", + "dependencies": { + "Avalonia": "0.10.13" + } + }, + "Avalonia.Remote.Protocol": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "hnklCHyLCMrzWjMc3T0mYkRKdfUqpw2qCkf9HBRzyqnI6uG5tLw2QIlRF9zYC4BGOpx/B/647IcIjgq6H1ypzQ==" + }, + "Avalonia.Skia": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "aG0JlUhCpwGM/QsN/+rRak7XlPy0Jtd5HaiCdYKtuBOc+ISGs6hmCJDKjklNANp9gZR/TUUgXkqk5VFMQUJkTA==", + "dependencies": { + "Avalonia": "0.10.13", + "HarfBuzzSharp": "2.8.2-preview.178", + "HarfBuzzSharp.NativeAssets.Linux": "2.8.2-preview.178", + "HarfBuzzSharp.NativeAssets.WebAssembly": "2.8.2-preview.178", + "SkiaSharp": "2.88.0-preview.178", + "SkiaSharp.NativeAssets.Linux": "2.88.0-preview.178", + "SkiaSharp.NativeAssets.WebAssembly": "2.88.0-preview.178" + } + }, + "Avalonia.Svg.Skia": { + "type": "Transitive", + "resolved": "0.10.12", + "contentHash": "qsXKdm5eWpfoVPe0xgtxhbOYlhG8QdbYNJZTTihg/c4iPFYuh1G7DldiNskuVFuGiGxLVZ0g6ebql7ZkwbO1pA==", + "dependencies": { + "Avalonia": "0.10.12", + "Avalonia.Skia": "0.10.12", + "SkiaSharp": "2.88.0-preview.178", + "Svg.Skia": "0.5.12" + } + }, + "Avalonia.Win32": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "CNUGWafAonBYYbHMliujDrs4JH2giH435GxU+O1q/nGyO5Mm+PXCG4NYsg+0zwp8yQBapFK7eYwzamU+re+cDw==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Angle.Windows.Natives": "2.1.0.2020091801", + "System.Drawing.Common": "4.5.0", + "System.Numerics.Vectors": "4.5.0" + } + }, + "Avalonia.X11": { + "type": "Transitive", + "resolved": "0.10.13", + "contentHash": "kXxn79KVB0ZfeZqQL7c2Dlvl96GBlRT8rzAh6g/j0hcgykQ55/e0be8Te6+Ny7hI+tFrob6lxvYdxYVUUCjHYg==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.FreeDesktop": "0.10.13", + "Avalonia.Skia": "0.10.13" + } + }, + "Avalonia.Xaml.Behaviors": { + "type": "Transitive", + "resolved": "0.10.13.2", + "contentHash": "sZlq6FFzNNzYmHK+vARWFpxtDY4XUdnU6q6zVIm4l1iQ3/ZXor4SeUnYDdd3lFZtoJ9yc8K2g4X7d/lVEgV9tA==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Xaml.Interactions": "0.10.13.2", + "Avalonia.Xaml.Interactivity": "0.10.13.2" + } + }, + "Avalonia.Xaml.Interactions": { + "type": "Transitive", + "resolved": "0.10.13.2", + "contentHash": "bMgr5NtEjJ/qvf+1JD4T4rRt9AbZNnJdYCx5cBfGyXHETbeliTJAt07mqTahcoPY1G2FskF1OSIW5ytljbviLw==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Xaml.Interactivity": "0.10.13.2" + } + }, + "Avalonia.Xaml.Interactivity": { + "type": "Transitive", + "resolved": "0.10.13.2", + "contentHash": "OIjK5XCsUrBCqog8lxI/DEbubaNQRwy8e8Px4i3dvllomU28EYsJm4XtrPVakY7MC+we825uXY47tsO/benLug==", + "dependencies": { + "Avalonia": "0.10.13" + } + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "4.2.0", + "contentHash": "1TtKHYYVfox7aUZ0akCqkULmAjpG8X5ZRzTzTiONY34xtvvaPuUSSdVL1VaF/1/ljRhOkpy+uKOGn6XoFGvorw==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.TypeConverter": "4.3.0", + "System.Diagnostics.TraceSource": "4.3.0", + "System.Dynamic.Runtime": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + }, + "DynamicData": { + "type": "Transitive", + "resolved": "7.5.4", + "contentHash": "1OpHPoyQGzHREiP6JXnPaBBx4KWVQZW7zBAZpKXc9kl4rcbEK4fo2/T3bDXZbHWKhDqVAISW9pE4Ug9+ms3RoA==", + "dependencies": { + "System.Reactive": "5.0.0" + } + }, + "EmbedIO": { + "type": "Transitive", + "resolved": "3.4.3", + "contentHash": "YM6hpZNAfvbbixfG9T4lWDGfF0D/TqutbTROL4ogVcHKwPF1hp+xS3ABwd3cxxTxvDFkj/zZl57QgWuFA8Igxw==", + "dependencies": { + "Unosquare.Swan.Lite": "3.0.0" + } + }, + "Fizzler": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "CPxuWF8EPvM0rwAtMTR5G+7EuLoGNXsEfqyx06upN9JyVALZ73KgbGn3SLFwGosifiUAXrvNHtXlUwGGytdECg==" + }, + "FluentAvaloniaUI": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "xzcsuOswakMpz/EdA59NEOgaCtZ/9zsd5QWTB0YYQqSv1GF95Uk2aMVtO5gtfNrCT4lZvGNWVf3HGjYz9cHovQ==", + "dependencies": { + "Avalonia": "0.10.13", + "Avalonia.Desktop": "0.10.13", + "Avalonia.Diagnostics": "0.10.13", + "MicroCom.CodeGenerator.MSBuild": "0.10.4", + "MicroCom.Runtime": "0.10.4" + } + }, + "Flurl": { + "type": "Transitive", + "resolved": "3.0.2", + "contentHash": "1/6mqdzGCTdAekbWkVZBTylCV+8g3JUSTXRBngRVR274S+RsAYNRF79GbDoDsPfMKu8VPc9HkQWdBEAncK1PQQ==" + }, + "Flurl.Http": { + "type": "Transitive", + "resolved": "3.2.0", + "contentHash": "5S8YiJm5CyRFO418GG9PDrsgmGEaZJtZLUqk3xqBKrfx7W9eKtOSpeji/GwAL+tSgNTALKBPvBKTaT4S83Oo+w==", + "dependencies": { + "Flurl": "3.0.2", + "Newtonsoft.Json": "12.0.2", + "System.Text.Encoding.CodePages": "4.5.1" + } + }, + "HarfBuzzSharp": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "OUir5qn95QRtlc8RWKfU/63xYwtuAbylL2oAj3eBWgAsVoWnFrEv+Oh1sj0xjW7mogFGaeGtY40lqAD1srWJcQ==", + "dependencies": { + "HarfBuzzSharp.NativeAssets.Win32": "2.8.2-preview.178", + "HarfBuzzSharp.NativeAssets.macOS": "2.8.2-preview.178", + "System.Memory": "4.5.3" + } + }, + "HarfBuzzSharp.NativeAssets.Linux": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "4scihdELcRpCEubBsUMHUJn93Xvx6ASj596WfO9y8CEuFNW0LBMDL71HBCyq5zXsn8HyGjLtoBLW0PpXbVnpjQ==", + "dependencies": { + "HarfBuzzSharp": "2.8.2-preview.178" + } + }, + "HarfBuzzSharp.NativeAssets.macOS": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "QtmAs62il4vFtt3fFOXhhPDl7TX+NGu4tFB5qmnqUn+EnSJW7mxqNk1n9I7+Z2ORym0nTP4dhcRNtOpOS7Oenw==" + }, + "HarfBuzzSharp.NativeAssets.WebAssembly": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "+S8qtBAVTrt+E85jZXPxYthUgSUq7iB6UZ0v0WFsy9gWhZ/hVE3hZJpcgeywT9H/SRX3ZIX+qzpKJlOM+mUcNA==" + }, + "HarfBuzzSharp.NativeAssets.Win32": { + "type": "Transitive", + "resolved": "2.8.2-preview.178", + "contentHash": "EgeF5uCZcAriIHmWq3hKNxz/jBJLeP/PKU4yI87UNkJCt4hYignOMjY0irl/rGVZtTL/G05xxf7TB6sjisi8sQ==" + }, + "HidSharp": { + "type": "Transitive", + "resolved": "2.1.0", + "contentHash": "UTdxWvbgp2xzT1Ajaa2va+Qi3oNHJPasYmVhbKI2VVdu1VYP6yUG+RikhsHvpD7iM0S8e8UYb5Qm/LTWxx9QAA==" + }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.11.10", + "contentHash": "4TBsHSXPocdsEB5dewIHeKykTzIz5Ui7ouXw4JsUGI+ax4jjviVJVD7+gsPCNyA+b3de2EjYI+jcEq8I/1ZFSQ==" + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "10.3.0", + "contentHash": "0GLU9lwGVXjUNlr9ZIdAgjqLI2Zm/XFGJFaqJ1T1sU+kwfeMLhm68+rblUrNUP9psRl4i8yM7Ghb4ia4oI2E5g==", + "dependencies": { + "System.Runtime": "4.1.0" + } + }, + "LiteDB": { + "type": "Transitive", + "resolved": "5.0.11", + "contentHash": "6cL4bOmVCUB0gIK+6qIr68HeqjjHZicPDGQjvJ87mIOvkFsEsJWkIps3yoKNeLpHhJQur++yoQ9Q8gxsdos0xQ==" + }, + "Live.Avalonia": { + "type": "Transitive", + "resolved": "1.3.1", + "contentHash": "FIzh7k2PWsgIBjS4no51ZzWxYmzTG/RzC0DUO6PzoiKkqyKpvSpOvcRg+41Roz6X8VnYCIVm61R7TFlT4eUFKA==", + "dependencies": { + "Avalonia": "0.10.0" + } + }, + "Material.Icons": { + "type": "Transitive", + "resolved": "1.0.2", + "contentHash": "4UIT91QbedjNfUYU+R3T60U+InozFtIsP1iUzGbkq/G0f1eDE3tXMWUuLEDO3yCEP2MHrPjAOpokwqk1rnWNGA==", + "dependencies": { + "Newtonsoft.Json": "12.0.3" + } + }, + "Material.Icons.Avalonia": { + "type": "Transitive", + "resolved": "1.0.2", + "contentHash": "hK0MQm2XyPwjT+DiviDOBjrJVQe6V0u+XTDVbxohkq58hUBlq0XZXmHHZ27jUJU6ZVP9ybu44aXfWycbVjnY2A==", + "dependencies": { + "Avalonia": "0.10.0", + "Material.Icons": "1.0.2" + } + }, + "McMaster.NETCore.Plugins": { + "type": "Transitive", + "resolved": "1.4.0", + "contentHash": "UKw5Z2/QHhkR7kiAJmqdCwVDMQV0lwsfj10+FG676r8DsJWIpxtachtEjE0qBs9WoK5GUQIqxgyFeYUSwuPszg==", + "dependencies": { + "Microsoft.DotNet.PlatformAbstractions": "3.1.6", + "Microsoft.Extensions.DependencyModel": "5.0.0" + } + }, + "MicroCom.CodeGenerator.MSBuild": { + "type": "Transitive", + "resolved": "0.10.4", + "contentHash": "aG1kLtkgX6lC8qpxVon4OFSCdWYEbQubIg+2/ychWTIFTrDHWFkhcC4YTn0IfGiVCLwh0Yj7eSc8nk5f3UoMKg==" + }, + "MicroCom.Runtime": { + "type": "Transitive", + "resolved": "0.10.4", + "contentHash": "enc2U+/1UnF3rtocxb5ofcg7cJSmJI4adbYPr8DZa5bQzvhqA/VbjlcalxoqjI3CR2RvM5WWpjKT0p3BriFJjw==" + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "2.9.6", + "contentHash": "Kmms3TxGQMNb95Cu/3K+0bIcMnV4qf/phZBLAB0HUi65rBPxP4JO3aM2LoAcb+DFS600RQJMZ7ZLyYDTbLwJOQ==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "3.4.0", + "contentHash": "3ncA7cV+iXGA1VYwe2UEZXcvWyZSlbexWjM9AvocP7sik5UD93qt9Hq0fMRGk0jFRmvmE4T2g+bGfXiBVZEhLw==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "2.9.6", + "System.Collections.Immutable": "1.5.0", + "System.Memory": "4.5.3", + "System.Reflection.Metadata": "1.6.0", + "System.Runtime.CompilerServices.Unsafe": "4.5.2", + "System.Text.Encoding.CodePages": "4.5.1", + "System.Threading.Tasks.Extensions": "4.5.3" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "3.4.0", + "contentHash": "/LsTtgcMN6Tu1oo7/WYbRAHL4/ubXC/miEakwTpcZKJKtFo7D0AK95Hw0dbGxul6C8WJu60v6NP2435TDYZM+Q==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[3.4.0]" + } + }, + "Microsoft.CodeAnalysis.CSharp.Scripting": { + "type": "Transitive", + "resolved": "3.4.0", + "contentHash": "tLgqc76qXHmONUhWhxo7z3TcL/LmGFWIUJm1exbQmVJohuQvJnejUMxmVkdxDfMuMZU1fIyJXPZ6Fkp4FEneAg==", + "dependencies": { + "Microsoft.CSharp": "4.3.0", + "Microsoft.CodeAnalysis.CSharp": "[3.4.0]", + "Microsoft.CodeAnalysis.Common": "[3.4.0]", + "Microsoft.CodeAnalysis.Scripting.Common": "[3.4.0]" + } + }, + "Microsoft.CodeAnalysis.Scripting.Common": { + "type": "Transitive", + "resolved": "3.4.0", + "contentHash": "+b6I3DZL2zvck+B/E/aiOveakj5U2G2BcYODQxcGh2IDbatNU3XXxGT1HumkWB5uIZI2Leu0opBgBpjScmjGMA==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[3.4.0]" + } + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "P+MBhIM0YX+JqROuf7i306ZLJEjQYA9uUyRDE+OqwUI5sh41e2ZbPQV3LfAPh+29cmceE1pUffXsGfR4eMY3KA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Dynamic.Runtime": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "Microsoft.DotNet.PlatformAbstractions": { + "type": "Transitive", + "resolved": "3.1.6", + "contentHash": "jek4XYaQ/PGUwDKKhwR8K47Uh1189PFzMeLqO83mXrXQVIpARZCcfuDedH50YDTepBkfijCZN5U/vZi++erxtg==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "umBECCoMC+sOUgm083yFr8SxTobUOcPFH4AXigdO2xJiszCHAnmeDl4qPphJt+oaJ/XIfV1wOjIts2nRnki61Q==" + }, + "Microsoft.Extensions.ObjectPool": { + "type": "Transitive", + "resolved": "5.0.9", + "contentHash": "grj0e6Me0EQsgaurV0fxP0xd8sz8eZVK+Jb816DPzNADHaqXaXJD3xZX9SFjyDl3ykAYvD0y77o5vRd9Hzsk9g==" + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "LuI1oG+24TUj1ZRQQjM5Ew73BKnZE5NZ/7eAdh1o8ST5dPhUnJvIkiIn2re3MwnkRy6ELRnvEbBxHP8uALKhJw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "Ninject": { + "type": "Transitive", + "resolved": "3.3.4", + "contentHash": "CmbWW97FfJuh4LEOVZM/spqXl4KAulRUjqeMwRd5J9rDMQArmIYaDMU3pyzXXHT062tbF0OPIMwI7tSOtprPfg==", + "dependencies": { + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0" + } + }, + "Ninject.Extensions.ChildKernel": { + "type": "Transitive", + "resolved": "3.3.0", + "contentHash": "vl/p3f8sIaCCHiKsjhq9R8n3bH705Hu1WJXNpMEz1UC79EV51Mk5TWYXQbRnsK20hxF48CiAgUBb9pMKfX6sLw==", + "dependencies": { + "Ninject": "3.3.4" + } + }, + "Ninject.Extensions.Conventions": { + "type": "Transitive", + "resolved": "3.3.0", + "contentHash": "bAMK7tRHIRQ+gjR1WxwTlNuP+/bKRIFf6NKObkWP3XVzFQhsLEKA0hEo73OXuBdpng0jczhqCGmwu630nIa/bg==", + "dependencies": { + "Ninject.Extensions.Factory": "3.3.2" + } + }, + "Ninject.Extensions.Factory": { + "type": "Transitive", + "resolved": "3.3.2", + "contentHash": "H9s77i9WsbgF6s7OieQ+c51KoW90jJAQqb0ClEqi6SBtL7jySUjh/5HCjnYgyQ8iYcWhvhw9cFnYxX9CB1kL7Q==", + "dependencies": { + "Castle.Core": "4.2.0", + "Ninject": "3.3.3" + } + }, + "NoStringEvaluating": { + "type": "Transitive", + "resolved": "2.2.2", + "contentHash": "hJHivPDA1Vxn0CCgOtHKZ3fmldxQuz7VL1J4lEaPTXCf+Vwcx1FDf05mGMh6olYMSxoKimGX8YK2sEoqeH3pnA==", + "dependencies": { + "Microsoft.Extensions.ObjectPool": "5.0.9" + } + }, + "ReactiveUI.Validation": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "rhEphZ4ErbGfNtbBQ/tYMsLJYHyLVyqidU+sgZ3kXKbS7QrNoM4j6PPxCwLMKsJUuvVL8JN45xgmB9tSwm7+lg==", + "dependencies": { + "ReactiveUI": "16.2.6" + } + }, + "RGB.NET.Core": { + "type": "Transitive", + "resolved": "1.0.0-prerelease7", + "contentHash": "IIja5sC4QZ5pbSNckRCG7TlY4U6j/dRbrl4e2FZqsTGgsevaVB3IqonUQLFY1GGst4xNSl2oh0A23coXQxXGbQ==" + }, + "RGB.NET.Layout": { + "type": "Transitive", + "resolved": "1.0.0-prerelease7", + "contentHash": "S0kfWVa8EfMOAl2WPHsq98dwaO+SNz9TWr1AtMkdo8aZuYIVhaJ1c+mSAMMnH1V+mSbxDWPHWkNzi9ITszJucA==", + "dependencies": { + "RGB.NET.Core": "1.0.0-prerelease7" + } + }, + "RGB.NET.Presets": { + "type": "Transitive", + "resolved": "1.0.0-prerelease7", + "contentHash": "NgShvOPQM0miOsdqMKjkNunngJUZMwr8KR8ME2/Ksir7wgIQfgJj1YwZy8aIj+ar7fDo6VZJZenAshs/Ul+04A==", + "dependencies": { + "RGB.NET.Core": "1.0.0-prerelease7" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "Serilog": { + "type": "Transitive", + "resolved": "2.10.0", + "contentHash": "+QX0hmf37a0/OZLxM3wL7V6/ADvC1XihXN4Kq/p6d8lCPfgkRdiuhbWlMaFjR9Av0dy5F0+MBeDmDdRZN/YwQA==" + }, + "Serilog.Sinks.Console": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "apLOvSJQLlIbKlbx+Y2UDHSP05kJsV7mou+fvJoRGs/iR+jC22r8cuFVMjjfVxz/AD4B2UCltFhE1naRLXwKNw==", + "dependencies": { + "Serilog": "2.10.0" + } + }, + "Serilog.Sinks.Debug": { + "type": "Transitive", + "resolved": "2.0.0", + "contentHash": "Y6g3OBJ4JzTyyw16fDqtFcQ41qQAydnEvEqmXjhwhgjsnG/FaJ8GUqF5ldsC/bVkK8KYmqrPhDO+tm4dF6xx4A==", + "dependencies": { + "Serilog": "2.10.0" + } + }, + "Serilog.Sinks.File": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==", + "dependencies": { + "Serilog": "2.10.0" + } + }, + "ShimSkiaSharp": { + "type": "Transitive", + "resolved": "0.5.12", + "contentHash": "oUGM7gQHRzbGPRs3E1pe5e8VwML21YyEz9xdo+r2ov1mAqSDPyXErVQP6pN4gnfYMVf5ADR7BVkVzt4R9Iz3gQ==" + }, + "SkiaSharp": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "arzd/44ykiBPqGWUuQqNTuJ49rhsXOg4Zw1p2Mm3B/5PZzV1wcTH4V+J+4ra8RS0KbIoy4KWeNF+zHAifNsiRg==", + "dependencies": { + "SkiaSharp.NativeAssets.Win32": "2.88.0-preview.178", + "SkiaSharp.NativeAssets.macOS": "2.88.0-preview.178", + "System.Memory": "4.5.3" + } + }, + "SkiaSharp.HarfBuzz": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "qTf3PbRJsTVOttQkYWOCswa1QnkH0dEOqMSgr3iXZQuKPNlj1qpGY8+OGPs25WKgUEqOpv2nog/AYQ/bpyOXzA==", + "dependencies": { + "HarfBuzzSharp": "2.8.2-preview.178", + "SkiaSharp": "2.88.0-preview.178" + } + }, + "SkiaSharp.NativeAssets.Linux": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "nc9C8zGvL2G7p0lcTPhN4EOt2Mozv6KLJinMwjF97sYoI5cpkXCPZSRTcyf8k49gAZaOd+UMGaygCAz/8vaaWg==", + "dependencies": { + "SkiaSharp": "2.88.0-preview.178" + } + }, + "SkiaSharp.NativeAssets.macOS": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "+Hs3ku4buimzBHuc8FoyjOcE6eU5r98zcG7WH/s+doYQ1bFIjk+dKfqthgZ2o0NRAv8D3esq9rWrZTj12q+m1w==" + }, + "SkiaSharp.NativeAssets.WebAssembly": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "u4Ss81oOlx0dhu5fxl4vK5f2Hm7psHDUSAoQValNV/BmixsW4TkETE3dOnHNRWwI56++tRG9dK33HimZDUrUpw==" + }, + "SkiaSharp.NativeAssets.Win32": { + "type": "Transitive", + "resolved": "2.88.0-preview.178", + "contentHash": "9og9GCkdZc/NYrmbsRzohmIBRlS1oFegJiBMsoG93qYjhh2o6q5QBYxd61zw5Mgeytl3qj4YM+6BNIF4tcF+6w==" + }, + "Splat": { + "type": "Transitive", + "resolved": "14.1.45", + "contentHash": "ayHdfTUklD5ci0s9m4uYMccjtkKVjZ9fVPT5q3PN+SnvyD6bjQVRozOfUHwdwh4LAz9ETZjR/tAgrm+IapXKrw==" + }, + "Splat.Ninject": { + "type": "Transitive", + "resolved": "14.1.45", + "contentHash": "aU851Yb7i4kLzzrpo3KxFZg/U0vd36ORza9nk51pvL/QE+Jkm3ROqoPMf+BPfugEub2J1hHDEuLKJtxU7TAt0w==", + "dependencies": { + "Ninject": "3.3.4", + "Splat": "14.1.45" + } + }, + "Svg.Custom": { + "type": "Transitive", + "resolved": "0.5.12", + "contentHash": "kmjLQf5U5WC7tRGBedUhtrOUCR0NaNL2auzOA2a/oMwEA0Bjrpd6qvMTpJUS3HITxi8vJazGl270K+i0JvdJog==", + "dependencies": { + "Fizzler": "1.2.0", + "System.Memory": "4.5.3", + "System.ObjectModel": "4.3.0", + "System.ValueTuple": "4.5.0" + } + }, + "Svg.Model": { + "type": "Transitive", + "resolved": "0.5.12", + "contentHash": "/CPiXIugg4oVyYlQr26fB1X9iQfICALF8AJXbTWnXGoP2WZa1t6aZbAXPk3HoPApA0w5waf3XXkBiYYnWwawaQ==", + "dependencies": { + "ShimSkiaSharp": "0.5.12", + "Svg.Custom": "0.5.12" + } + }, + "Svg.Skia": { + "type": "Transitive", + "resolved": "0.5.12", + "contentHash": "KjKpjz0FKge+WpRzjD1bqywAW3vZhXwpR5c7Ej5OuP4xDrQjBwtFeB0iZ+yEJMzwXf/Rs4ImuN8m3bmBDJvMHg==", + "dependencies": { + "SkiaSharp": "2.88.0-preview.178", + "SkiaSharp.HarfBuzz": "2.88.0-preview.178", + "Svg.Custom": "0.5.12", + "Svg.Model": "0.5.12" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "1.5.0", + "contentHash": "EXKiDFsChZW0RjrZ4FYHu9aW6+P4MCgEDCklsVseRfhoO0F+dXeMSsMRAlVXIo06kGJ/zv+2w1a2uc2+kxxSaQ==" + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", + "dependencies": { + "System.Collections.NonGeneric": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==", + "dependencies": { + "System.ComponentModel": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "16pQ6P+EdhcXzPiEK4kbA953Fu0MNG2ovxTZU81/qsCd1zPRsKc3uif5NgvllCY598k6bI0KUyKW8fanlfaDQg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.NonGeneric": "4.3.0", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.Primitives": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.TraceSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VnYp1NxGx8Ww731y2LJ1vpfb/DKVNKEZ8Jsh5SgQTZREL/YpWRArgh9pI8CDLmgHspZmLL697CaLvH85qQpRiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "AiJFxxVPdeITstiRS5aAu8+8Dpf5NawTMoapZ53Gfirml24p7HIfhjmCRxdXnmmf3IUA3AX3CcW7G73CjWxW/Q==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.0.0", + "Microsoft.Win32.SystemEvents": "4.5.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SNVi1E/vfWUAs/WYKhE9+qlS6KqK0YVhnlT0HQtr8pMIA8YX3lwy3uPMownDwdYISBdmAF/2holEIldVp85Wag==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.3", + "contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reactive": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==" + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VR4kk8XLKebQ4MZuKuIni/7oh+QGFmZW3qORd1GvBq/8026OpW501SzT/oypwiQl4TvT8ErnReh/NzY9u+C6wQ==" + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "HxozeSlipUK7dAroTYwIcGwKDeOVpQnJlpVaOkBz7CM4TsE5b/tKlQBZecTjh6FzcSbxndYaxxpsBMz+wMJeyw==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==", + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.2", + "System.Runtime.CompilerServices.Unsafe": "4.5.2" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.3", + "contentHash": "+MvhNtcvIbqmhANyKu91jQnvIRVSTiaOiFNfKWwXGHG48YAb4I/TyH8spsySiPYla7gKal5ZnF3teJqZAximyQ==" + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.ValueTuple": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "Tmds.DBus": { + "type": "Transitive", + "resolved": "0.9.0", + "contentHash": "KcTWL9aKuob9Qo2sOTTKFePs1rKGTwZrcBvMFuGVIVR5RojX3oIFj5UBLYfSGjYgrcImC7LjQI3DdCFwUnhNXw==", + "dependencies": { + "System.Reflection.Emit": "4.7.0", + "System.Security.Principal.Windows": "4.7.0" + } + }, + "Unosquare.Swan.Lite": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "noPwJJl1Q9uparXy1ogtkmyAPGNfSGb0BLT1292nFH1jdMKje6o2kvvrQUvF9Xklj+IoiAI0UzF6Aqxlvo10lw==" + }, + "artemis.core": { + "type": "Project", + "dependencies": { + "Artemis.Storage": "1.0.0", + "EmbedIO": "3.4.3", + "HidSharp": "2.1.0", + "Humanizer.Core": "2.11.10", + "LiteDB": "5.0.11", + "McMaster.NETCore.Plugins": "1.4.0", + "Newtonsoft.Json": "13.0.1", + "Ninject": "3.3.4", + "Ninject.Extensions.ChildKernel": "3.3.0", + "Ninject.Extensions.Conventions": "3.3.0", + "RGB.NET.Core": "1.0.0-prerelease7", + "RGB.NET.Layout": "1.0.0-prerelease7", + "RGB.NET.Presets": "1.0.0-prerelease7", + "Serilog": "2.10.0", + "Serilog.Sinks.Console": "4.0.1", + "Serilog.Sinks.Debug": "2.0.0", + "Serilog.Sinks.File": "5.0.0", + "SkiaSharp": "2.88.0-preview.178", + "System.Buffers": "4.5.1", + "System.IO.FileSystem.AccessControl": "5.0.0", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.Metadata": "5.0.0", + "System.ValueTuple": "4.5.0" + } + }, + "artemis.storage": { + "type": "Project", + "dependencies": { + "LiteDB": "5.0.11", + "Serilog": "2.10.0" + } + }, + "artemis.ui": { + "type": "Project", + "dependencies": { + "Artemis.Core": "1.0.0", + "Artemis.UI.Shared": "1.0.0", + "Artemis.VisualScripting": "1.0.0", + "Avalonia": "0.10.13", + "Avalonia.Controls.PanAndZoom": "10.12.0", + "Avalonia.Desktop": "0.10.13", + "Avalonia.Diagnostics": "0.10.13", + "Avalonia.ReactiveUI": "0.10.13", + "Avalonia.Svg.Skia": "0.10.12", + "Avalonia.Xaml.Behaviors": "0.10.13.2", + "DynamicData": "7.5.4", + "FluentAvaloniaUI": "1.3.0", + "Flurl.Http": "3.2.0", + "Live.Avalonia": "1.3.1", + "Material.Icons.Avalonia": "1.0.2", + "RGB.NET.Core": "1.0.0-prerelease7", + "RGB.NET.Layout": "1.0.0-prerelease7", + "ReactiveUI": "17.1.50", + "ReactiveUI.Validation": "2.2.1", + "SkiaSharp": "2.88.0-preview.178", + "Splat.Ninject": "14.1.45" + } + }, + "artemis.ui.shared": { + "type": "Project", + "dependencies": { + "Artemis.Core": "1.0.0", + "Avalonia": "0.10.13", + "Avalonia.ReactiveUI": "0.10.13", + "Avalonia.Svg.Skia": "0.10.12", + "Avalonia.Xaml.Behaviors": "0.10.13.2", + "DynamicData": "7.5.4", + "FluentAvaloniaUI": "1.3.0", + "Material.Icons.Avalonia": "1.0.2", + "RGB.NET.Core": "1.0.0-prerelease7", + "ReactiveUI": "17.1.50", + "ReactiveUI.Validation": "2.2.1", + "SkiaSharp": "2.88.0-preview.178" + } + }, + "artemis.visualscripting": { + "type": "Project", + "dependencies": { + "Artemis.Core": "1.0.0", + "Artemis.UI.Shared": "1.0.0", + "Avalonia": "0.10.13", + "Avalonia.ReactiveUI": "0.10.13", + "Avalonia.Xaml.Behaviors": "0.10.13.2", + "Ninject": "3.3.4", + "NoStringEvaluating": "2.2.2", + "ReactiveUI": "17.1.50", + "SkiaSharp": "2.88.0-preview.178" + } + } + } + } +} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Artemis.UI.Avalonia.Shared.csproj.DotSettings b/src/Artemis.UI.Shared/Artemis.UI.Avalonia.Shared.csproj.DotSettings similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Artemis.UI.Avalonia.Shared.csproj.DotSettings rename to src/Artemis.UI.Shared/Artemis.UI.Avalonia.Shared.csproj.DotSettings diff --git a/src/Avalonia/Artemis.UI.Shared/Artemis.UI.Avalonia.Shared.xml b/src/Artemis.UI.Shared/Artemis.UI.Avalonia.Shared.xml similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Artemis.UI.Avalonia.Shared.xml rename to src/Artemis.UI.Shared/Artemis.UI.Avalonia.Shared.xml diff --git a/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj b/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj index 78be76ec5..a55751eb4 100644 --- a/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj +++ b/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj @@ -1,76 +1,50 @@  - net6.0-windows - false - {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - false - Artemis.UI.Shared - Artemis.UI.Shared - Artemis.UI.Shared - Copyright © Robert Beekman - 2020 + Library + net6.0 + enable + + bin\ - true + x64 x64 - x64 - bin\Artemis.UI.Shared.xml - - - - 2.0-{chash:6} - true - true - true - v[0-9]* - true - git - true - 2.0.0 - enable - - - bin\Artemis.UI.Shared.xml + bin\Artemis.UI.Avalonia.Shared.xml - - - - - - + + + + + + + + + + + + + + - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - + + + + $(DefaultXamlRuntime) + MSBuild:Compile + - - - - - - - - - + - - + + + HotkeyBox.axaml + + + %(Filename) + - - - false - - - - - - \ No newline at end of file + diff --git a/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj.DotSettings b/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj.DotSettings index 5a02b2339..22557dc59 100644 --- a/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj.DotSettings +++ b/src/Artemis.UI.Shared/Artemis.UI.Shared.csproj.DotSettings @@ -1,20 +1,6 @@  - True - True - True - True - True - True - True True - True - True - True True - True - True - True - True - True True - True \ No newline at end of file + True + True \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/AttachedProperties/NumberBoxAssist.cs b/src/Artemis.UI.Shared/AttachedProperties/NumberBoxAssist.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/AttachedProperties/NumberBoxAssist.cs rename to src/Artemis.UI.Shared/AttachedProperties/NumberBoxAssist.cs diff --git a/src/Avalonia/Artemis.UI.Shared/AttachedProperties/TextBoxAssist.cs b/src/Artemis.UI.Shared/AttachedProperties/TextBoxAssist.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/AttachedProperties/TextBoxAssist.cs rename to src/Artemis.UI.Shared/AttachedProperties/TextBoxAssist.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Behaviors/LostFocusNumberBoxBindingBehavior.cs b/src/Artemis.UI.Shared/Behaviors/LostFocusNumberBoxBindingBehavior.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Behaviors/LostFocusNumberBoxBindingBehavior.cs rename to src/Artemis.UI.Shared/Behaviors/LostFocusNumberBoxBindingBehavior.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Behaviors/LostFocusTextBoxBindingBehavior.cs b/src/Artemis.UI.Shared/Behaviors/LostFocusTextBoxBindingBehavior.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Behaviors/LostFocusTextBoxBindingBehavior.cs rename to src/Artemis.UI.Shared/Behaviors/LostFocusTextBoxBindingBehavior.cs diff --git a/src/Artemis.UI.Shared/Behaviors/OpenInBrowser.cs b/src/Artemis.UI.Shared/Behaviors/OpenInBrowser.cs deleted file mode 100644 index e9c980033..000000000 --- a/src/Artemis.UI.Shared/Behaviors/OpenInBrowser.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Windows.Documents; -using System.Windows.Navigation; -using Artemis.Core; -using Microsoft.Xaml.Behaviors; - -namespace Artemis.UI.Shared -{ - /// - /// Represents a behavior that opens the URI of the hyperlink in the browser when requested - /// - public class OpenInBrowser : Behavior - { - private Hyperlink? _hyperLink; - - /// - protected override void OnAttached() - { - base.OnAttached(); - - _hyperLink = AssociatedObject; - if (_hyperLink == null) - return; - - _hyperLink.RequestNavigate += HyperLinkOnRequestNavigate; - } - - /// - protected override void OnDetaching() - { - if (_hyperLink == null) return; - _hyperLink.RequestNavigate -= HyperLinkOnRequestNavigate; - - base.OnDetaching(); - } - - private void HyperLinkOnRequestNavigate(object sender, RequestNavigateEventArgs e) - { - Utilities.OpenUrl(e.Uri.AbsoluteUri); - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Behaviors/PutCursorAtEndTextBoxBehavior.cs b/src/Artemis.UI.Shared/Behaviors/PutCursorAtEndTextBoxBehavior.cs deleted file mode 100644 index e5da6147d..000000000 --- a/src/Artemis.UI.Shared/Behaviors/PutCursorAtEndTextBoxBehavior.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Windows; -using System.Windows.Controls; -using Microsoft.Xaml.Behaviors; - -namespace Artemis.UI.Shared -{ - /// - /// Represents a behavior that puts the cursor at the end of a text box when it receives focus - /// - public class PutCursorAtEndTextBox : Behavior - { - private TextBox? _textBox; - - /// - protected override void OnAttached() - { - base.OnAttached(); - - _textBox = AssociatedObject as TextBox; - - if (_textBox == null) return; - _textBox.GotFocus += TextBoxGotFocus; - } - - /// - protected override void OnDetaching() - { - if (_textBox == null) return; - _textBox.GotFocus -= TextBoxGotFocus; - - base.OnDetaching(); - } - - private void TextBoxGotFocus(object sender, RoutedEventArgs routedEventArgs) - { - if (_textBox == null) return; - _textBox.CaretIndex = _textBox.Text.Length; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Behaviors/ScrollParentWhenAtMax.cs b/src/Artemis.UI.Shared/Behaviors/ScrollParentWhenAtMax.cs deleted file mode 100644 index aa91b1beb..000000000 --- a/src/Artemis.UI.Shared/Behaviors/ScrollParentWhenAtMax.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System.Windows; -using System.Windows.Controls; -using System.Windows.Input; -using System.Windows.Media; -using Microsoft.Xaml.Behaviors; - -namespace Artemis.UI.Shared -{ - /// - /// A behavior that makes a scroll viewer bubble up its events if it is at its scroll limit - /// - public class ScrollParentWhenAtMax : Behavior - { - /// - protected override void OnAttached() - { - base.OnAttached(); - AssociatedObject.PreviewMouseWheel += PreviewMouseWheel; - } - - /// - protected override void OnDetaching() - { - AssociatedObject.PreviewMouseWheel -= PreviewMouseWheel; - base.OnDetaching(); - } - - private void PreviewMouseWheel(object sender, MouseWheelEventArgs e) - { - ScrollViewer? scrollViewer = GetVisualChild(AssociatedObject); - if (scrollViewer == null) - return; - double scrollPos = scrollViewer.ContentVerticalOffset; - // ReSharper disable once CompareOfFloatsByEqualityOperator - if (scrollPos == scrollViewer.ScrollableHeight && e.Delta < 0 || scrollPos == 0 && e.Delta > 0) - { - e.Handled = true; - MouseWheelEventArgs e2 = new(e.MouseDevice, e.Timestamp, e.Delta); - e2.RoutedEvent = UIElement.MouseWheelEvent; - AssociatedObject.RaiseEvent(e2); - } - } - - private static T? GetVisualChild(DependencyObject parent) where T : Visual - { - T? child = default; - - int numVisuals = VisualTreeHelper.GetChildrenCount(parent); - for (int i = 0; i < numVisuals; i++) - { - Visual v = (Visual) VisualTreeHelper.GetChild(parent, i); - child = v as T; - if (child == null) child = GetVisualChild(v); - if (child != null) break; - } - - return child; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Bootstrapper.cs b/src/Artemis.UI.Shared/Bootstrapper.cs deleted file mode 100644 index c253012f8..000000000 --- a/src/Artemis.UI.Shared/Bootstrapper.cs +++ /dev/null @@ -1,34 +0,0 @@ -using Artemis.UI.Shared.Controls; -using Artemis.UI.Shared.Services; -using Ninject; - -namespace Artemis.UI.Shared -{ - /// - /// Represents the main entry point for the shared UI library - /// The Artemis UI calls this so there's no need to deal with this in a plugin - /// - public static class Bootstrapper - { - /// - /// Gets a boolean indicating whether or not the shared UI library has been initialized - /// - public static bool Initialized { get; private set; } - - /// - /// Initializes the shared UI library - /// - /// - public static void Initialize(IKernel kernel) - { - if (Initialized) - return; - - GradientPicker.ColorPickerService = kernel.Get(); - ColorPicker.ColorPickerService = kernel.Get(); - DataModelPicker.DataModelUIService = kernel.Get(); - - Initialized = true; - } - } -} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/ArtemisIcon.axaml b/src/Artemis.UI.Shared/Controls/ArtemisIcon.axaml similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/ArtemisIcon.axaml rename to src/Artemis.UI.Shared/Controls/ArtemisIcon.axaml diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/ArtemisIcon.axaml.cs b/src/Artemis.UI.Shared/Controls/ArtemisIcon.axaml.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/ArtemisIcon.axaml.cs rename to src/Artemis.UI.Shared/Controls/ArtemisIcon.axaml.cs diff --git a/src/Artemis.UI.Shared/Controls/ArtemisIcon.xaml b/src/Artemis.UI.Shared/Controls/ArtemisIcon.xaml deleted file mode 100644 index 33405a778..000000000 --- a/src/Artemis.UI.Shared/Controls/ArtemisIcon.xaml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/src/Artemis.UI.Shared/Controls/ArtemisIcon.xaml.cs b/src/Artemis.UI.Shared/Controls/ArtemisIcon.xaml.cs deleted file mode 100644 index 586eb0657..000000000 --- a/src/Artemis.UI.Shared/Controls/ArtemisIcon.xaml.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.Windows; -using System.Windows.Controls; -using MaterialDesignThemes.Wpf; - -namespace Artemis.UI.Shared -{ - /// - /// Interaction logic for ArtemisIcon.xaml - /// - public partial class ArtemisIcon : UserControl - { - /// - /// Gets or sets the currently displayed icon as either a or an pointing - /// to an SVG - /// - public static readonly DependencyProperty IconProperty = DependencyProperty.Register(nameof(Icon), typeof(object), typeof(ArtemisIcon), - new FrameworkPropertyMetadata(IconPropertyChangedCallback)); - - /// - /// Gets or sets the - /// - public static readonly DependencyProperty PackIconProperty = DependencyProperty.Register(nameof(PackIcon), typeof(PackIconKind?), typeof(ArtemisIcon), - new FrameworkPropertyMetadata(IconPropertyChangedCallback)); - - /// - /// Gets or sets the pointing to the SVG - /// - public static readonly DependencyProperty SvgSourceProperty = DependencyProperty.Register(nameof(SvgSource), typeof(Uri), typeof(ArtemisIcon), - new FrameworkPropertyMetadata(IconPropertyChangedCallback)); - - private bool _inCallback; - - /// - /// Creates a new instance of the class - /// - public ArtemisIcon() - { - InitializeComponent(); - } - - /// - /// Gets or sets the currently displayed icon as either a or an pointing - /// to an SVG - /// - public object? Icon - { - get => GetValue(IconProperty); - set => SetValue(IconProperty, value); - } - - /// - /// Gets or sets the - /// - public PackIconKind? PackIcon - { - get => (PackIconKind?) GetValue(PackIconProperty); - set => SetValue(PackIconProperty, value); - } - - /// - /// Gets or sets the pointing to the SVG - /// - public Uri SvgSource - { - get => (Uri) GetValue(SvgSourceProperty); - set => SetValue(SvgSourceProperty, value); - } - - private static void IconPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - ArtemisIcon artemisIcon = (ArtemisIcon) d; - if (artemisIcon._inCallback) - return; - - try - { - artemisIcon._inCallback = true; - if (artemisIcon.PackIcon != null) - { - artemisIcon.Icon = artemisIcon.PackIcon; - } - else if (artemisIcon.SvgSource != null) - { - artemisIcon.Icon = artemisIcon.SvgSource; - } - else if (artemisIcon.Icon is string iconString) - { - if (Uri.TryCreate(iconString, UriKind.Absolute, out Uri? uriResult)) - artemisIcon.Icon = uriResult; - else if (Enum.TryParse(typeof(PackIconKind), iconString, true, out object? result)) - artemisIcon.Icon = result; - } - } - finally - { - artemisIcon._inCallback = false; - } - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Controls/ColorPicker.xaml b/src/Artemis.UI.Shared/Controls/ColorPicker.xaml deleted file mode 100644 index 4077a0948..000000000 --- a/src/Artemis.UI.Shared/Controls/ColorPicker.xaml +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - « Invalid » - - - - \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Controls/DataModelPicker.xaml.cs b/src/Artemis.UI.Shared/Controls/DataModelPicker.xaml.cs deleted file mode 100644 index 84d3b4d33..000000000 --- a/src/Artemis.UI.Shared/Controls/DataModelPicker.xaml.cs +++ /dev/null @@ -1,343 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Linq; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media; -using System.Windows.Threading; -using Artemis.Core; -using Artemis.Core.Modules; -using Artemis.UI.Shared.Services; - -namespace Artemis.UI.Shared.Controls -{ - /// - /// Interaction logic for DataModelPicker.xaml - /// - public partial class DataModelPicker : INotifyPropertyChanged - { - private static IDataModelUIService _dataModelUIService; - - /// - /// Gets or sets data model path - /// - public static readonly DependencyProperty DataModelPathProperty = DependencyProperty.Register( - nameof(DataModelPath), typeof(DataModelPath), typeof(DataModelPicker), - new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, DataModelPathPropertyChangedCallback) - ); - - /// - /// Gets or sets the brush to use when drawing the button - /// - public static readonly DependencyProperty PlaceholderProperty = DependencyProperty.Register( - nameof(Placeholder), typeof(string), typeof(DataModelPicker), - new FrameworkPropertyMetadata("Click to select") - ); - - /// - /// Gets or sets the brush to use when drawing the button - /// - public static readonly DependencyProperty ShowDataModelValuesProperty = DependencyProperty.Register(nameof(ShowDataModelValues), typeof(bool), typeof(DataModelPicker)); - - /// - /// Gets or sets the brush to use when drawing the button - /// - public static readonly DependencyProperty ShowFullPathProperty = DependencyProperty.Register( - nameof(ShowFullPath), typeof(bool), typeof(DataModelPicker), - new FrameworkPropertyMetadata(ShowFullPathPropertyCallback) - ); - - /// - /// Gets or sets the brush to use when drawing the button - /// - public static readonly DependencyProperty ButtonBrushProperty = DependencyProperty.Register(nameof(ButtonBrush), typeof(Brush), typeof(DataModelPicker)); - - /// - /// A list of extra modules to show data models of - /// - public static readonly DependencyProperty ModulesProperty = DependencyProperty.Register( - nameof(Modules), typeof(ObservableCollection), typeof(DataModelPicker), - new FrameworkPropertyMetadata(new ObservableCollection(), FrameworkPropertyMetadataOptions.None, ModulesPropertyChangedCallback) - ); - - /// - /// The data model view model to show, if not provided one will be retrieved by the control - /// - public static readonly DependencyProperty DataModelViewModelProperty = DependencyProperty.Register( - nameof(DataModelViewModel), typeof(DataModelPropertiesViewModel), typeof(DataModelPicker), - new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.None, DataModelViewModelPropertyChangedCallback) - ); - - /// - /// A list of data model view models to show - /// - public static readonly DependencyProperty ExtraDataModelViewModelsProperty = DependencyProperty.Register( - nameof(ExtraDataModelViewModels), typeof(ObservableCollection), typeof(DataModelPicker), - new FrameworkPropertyMetadata(new ObservableCollection(), FrameworkPropertyMetadataOptions.None, ExtraDataModelViewModelsPropertyChangedCallback) - ); - - /// - /// A list of data model view models to show - /// - public static readonly DependencyProperty FilterTypesProperty = DependencyProperty.Register( - nameof(FilterTypes), typeof(ObservableCollection), typeof(DataModelPicker), - new FrameworkPropertyMetadata(new ObservableCollection()) - ); - - public DataModelPicker() - { - SelectPropertyCommand = new DelegateCommand(ExecuteSelectPropertyCommand); - Unloaded += OnUnloaded; - InitializeComponent(); - GetDataModel(); - UpdateValueDisplay(); - } - - /// - /// Gets or sets the brush to use when drawing the button - /// - public DataModelPath? DataModelPath - { - get => (DataModelPath) GetValue(DataModelPathProperty); - set => SetValue(DataModelPathProperty, value); - } - - /// - /// Gets or sets the brush to use when drawing the button - /// - public string Placeholder - { - get => (string) GetValue(PlaceholderProperty); - set => SetValue(PlaceholderProperty, value); - } - - /// - /// Gets or sets the brush to use when drawing the button - /// - public bool ShowDataModelValues - { - get => (bool) GetValue(ShowDataModelValuesProperty); - set => SetValue(ShowDataModelValuesProperty, value); - } - - /// - /// Gets or sets the brush to use when drawing the button - /// - public bool ShowFullPath - { - get => (bool) GetValue(ShowFullPathProperty); - set => SetValue(ShowFullPathProperty, value); - } - - /// - /// Gets or sets the brush to use when drawing the button - /// - public Brush ButtonBrush - { - get => (Brush) GetValue(ButtonBrushProperty); - set => SetValue(ButtonBrushProperty, value); - } - - /// - /// Gets or sets a list of extra modules to show data models of - /// - public ObservableCollection? Modules - { - get => (ObservableCollection) GetValue(ModulesProperty); - set => SetValue(ModulesProperty, value); - } - - /// - /// Gets or sets the data model view model to show - /// - public DataModelPropertiesViewModel? DataModelViewModel - { - get => (DataModelPropertiesViewModel) GetValue(DataModelViewModelProperty); - set => SetValue(DataModelViewModelProperty, value); - } - - /// - /// Gets or sets a list of data model view models to show - /// - public ObservableCollection? ExtraDataModelViewModels - { - get => (ObservableCollection) GetValue(ExtraDataModelViewModelsProperty); - set => SetValue(ExtraDataModelViewModelsProperty, value); - } - - /// - /// Gets or sets the types of properties this view model will allow to be selected - /// - public ObservableCollection? FilterTypes - { - get => (ObservableCollection) GetValue(FilterTypesProperty); - set => SetValue(FilterTypesProperty, value); - } - - /// - /// Command used by view - /// - public DelegateCommand SelectPropertyCommand { get; } - - internal static IDataModelUIService DataModelUIService - { - set - { - if (_dataModelUIService != null) - throw new AccessViolationException("This is not for you to touch"); - _dataModelUIService = value; - } - } - - /// - /// Occurs when a new path has been selected - /// - public event EventHandler? DataModelPathSelected; - - /// - /// Invokes the event - /// - /// - protected virtual void OnDataModelPathSelected(DataModelSelectedEventArgs e) - { - DataModelPathSelected?.Invoke(this, e); - } - - private void GetDataModel() - { - ChangeDataModel(_dataModelUIService.GetPluginDataModelVisualization(Modules?.ToList() ?? new List(), true)); - } - - private void ChangeDataModel(DataModelPropertiesViewModel? dataModel) - { - if (DataModelViewModel != null) - { - DataModelViewModel.Dispose(); - DataModelViewModel.UpdateRequested -= DataModelOnUpdateRequested; - } - - DataModelViewModel = dataModel; - if (DataModelViewModel != null) - DataModelViewModel.UpdateRequested += DataModelOnUpdateRequested; - } - - private void UpdateValueDisplay() - { - ValueDisplay.Visibility = DataModelPath == null || DataModelPath.IsValid ? Visibility.Visible : Visibility.Collapsed; - ValuePlaceholder.Visibility = DataModelPath == null || DataModelPath.IsValid ? Visibility.Collapsed : Visibility.Visible; - - string? formattedPath = null; - if (DataModelPath != null && DataModelPath.IsValid) - formattedPath = string.Join(" › ", DataModelPath.Segments.Where(s => s.GetPropertyDescription() != null).Select(s => s.GetPropertyDescription()!.Name)); - - DataModelButton.ToolTip = formattedPath; - ValueDisplayTextBlock.Text = ShowFullPath - ? formattedPath - : DataModelPath?.Segments.LastOrDefault()?.GetPropertyDescription()?.Name ?? DataModelPath?.Segments.LastOrDefault()?.Identifier; - } - - private void DataModelOnUpdateRequested(object? sender, EventArgs e) - { - DataModelViewModel?.ApplyTypeFilter(true, FilterTypes?.ToArray() ?? Type.EmptyTypes); - if (ExtraDataModelViewModels == null) return; - foreach (DataModelPropertiesViewModel extraDataModelViewModel in ExtraDataModelViewModels) - extraDataModelViewModel.ApplyTypeFilter(true, FilterTypes?.ToArray() ?? Type.EmptyTypes); - } - - private void ExecuteSelectPropertyCommand(object? context) - { - if (context is not DataModelVisualizationViewModel selected) - return; - - if (selected.DataModelPath == null) - return; - if (selected.DataModelPath.Equals(DataModelPath)) - return; - - DataModelPath = new DataModelPath(selected.DataModelPath); - OnDataModelPathSelected(new DataModelSelectedEventArgs(DataModelPath)); - } - - private void PropertyButton_OnClick(object sender, RoutedEventArgs e) - { - // DataContext is not set when using left button, I don't know why but there it is - if (sender is Button button && button.ContextMenu != null) - { - button.ContextMenu.DataContext = button.DataContext; - button.ContextMenu.IsOpen = true; - } - } - - private static void DataModelPathPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - if (d is not DataModelPicker dataModelPicker) - return; - - if (e.OldValue is DataModelPath oldPath) - { - oldPath.PathInvalidated -= dataModelPicker.PathValidationChanged; - oldPath.PathValidated -= dataModelPicker.PathValidationChanged; - oldPath.Dispose(); - } - - dataModelPicker.UpdateValueDisplay(); - if (e.NewValue is DataModelPath newPath) - { - newPath.PathInvalidated += dataModelPicker.PathValidationChanged; - newPath.PathValidated += dataModelPicker.PathValidationChanged; - } - } - - private static void ShowFullPathPropertyCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - if (d is not DataModelPicker dataModelPicker) - return; - - dataModelPicker.UpdateValueDisplay(); - } - - private static void ModulesPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - if (d is not DataModelPicker dataModelPicker) - return; - - dataModelPicker.GetDataModel(); - } - - private static void DataModelViewModelPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - if (d is not DataModelPicker dataModelPicker) - return; - - if (e.OldValue is DataModelPropertiesViewModel vm) - vm.Dispose(); - } - - private static void ExtraDataModelViewModelsPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - if (d is not DataModelPicker dataModelPicker) - return; - } - - private void PathValidationChanged(object? sender, EventArgs e) - { - Dispatcher.Invoke(UpdateValueDisplay, DispatcherPriority.DataBind); - } - - private void OnUnloaded(object o, RoutedEventArgs routedEventArgs) - { - if (DataModelPath != null) - { - DataModelPath.PathInvalidated -= PathValidationChanged; - DataModelPath.PathValidated -= PathValidationChanged; - } - - DataModelViewModel?.Dispose(); - } - - /// - public event PropertyChangedEventHandler? PropertyChanged; - } -} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPicker.cs b/src/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPicker.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPicker.cs rename to src/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPicker.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPickerButton.cs b/src/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPickerButton.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPickerButton.cs rename to src/Artemis.UI.Shared/Controls/DataModelPicker/DataModelPickerButton.cs diff --git a/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs b/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs index 427ad1808..b5a944faf 100644 --- a/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs +++ b/src/Artemis.UI.Shared/Controls/DeviceVisualizer.cs @@ -1,94 +1,93 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; -using System.Collections.Specialized; using System.ComponentModel; using System.IO; using System.Linq; -using System.Timers; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Threading; +using System.Threading.Tasks; using Artemis.Core; +using Artemis.UI.Shared.Events; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Input; +using Avalonia.LogicalTree; +using Avalonia.Media; +using Avalonia.Media.Imaging; +using Avalonia.Platform; +using Avalonia.Rendering; +using Avalonia.Threading; +using Avalonia.Visuals.Media.Imaging; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Controls { /// /// Visualizes an with optional per-LED colors /// - public class DeviceVisualizer : FrameworkElement + public class DeviceVisualizer : Control { - /// - /// The device to visualize - /// - public static readonly DependencyProperty DeviceProperty = DependencyProperty.Register(nameof(Device), typeof(ArtemisDevice), typeof(DeviceVisualizer), - new FrameworkPropertyMetadata(default(ArtemisDevice), FrameworkPropertyMetadataOptions.AffectsRender, DevicePropertyChangedCallback)); - - /// - /// Whether or not to show per-LED colors - /// - public static readonly DependencyProperty ShowColorsProperty = DependencyProperty.Register(nameof(ShowColors), typeof(bool), typeof(DeviceVisualizer), - new FrameworkPropertyMetadata(default(bool), FrameworkPropertyMetadataOptions.AffectsRender, ShowColorsPropertyChangedCallback)); - - /// - /// A list of LEDs to highlight - /// - public static readonly DependencyProperty HighlightedLedsProperty = DependencyProperty.Register(nameof(HighlightedLeds), typeof(ObservableCollection), typeof(DeviceVisualizer), - new FrameworkPropertyMetadata(default(ObservableCollection), HighlightedLedsPropertyChanged)); - - private readonly DrawingGroup _backingStore; + private const double UpdateFrameRate = 25.0; private readonly List _deviceVisualizerLeds; private readonly DispatcherTimer _timer; - private BitmapImage? _deviceImage; - private ArtemisDevice? _oldDevice; - private List _highlightedLeds; - private List _dimmedLeds; - /// - /// Creates a new instance of the class - /// + private Rect _deviceBounds; + private RenderTargetBitmap? _deviceImage; + private List? _dimmedLeds; + private List? _highlightedLeds; + private ArtemisDevice? _oldDevice; + + /// public DeviceVisualizer() { - _backingStore = new DrawingGroup(); + _timer = new DispatcherTimer(DispatcherPriority.Render) {Interval = TimeSpan.FromMilliseconds(1000.0 / UpdateFrameRate)}; _deviceVisualizerLeds = new List(); - _dimmedLeds = new List(); - // Run an update timer at 25 fps - _timer = new DispatcherTimer(DispatcherPriority.Render) {Interval = TimeSpan.FromMilliseconds(40)}; - - MouseLeftButtonUp += OnMouseLeftButtonUp; - Loaded += OnLoaded; - Unloaded += OnUnloaded; + PointerReleased += OnPointerReleased; } - /// - /// Gets or sets the device to visualize - /// - public ArtemisDevice? Device + /// + public override void Render(DrawingContext drawingContext) { - get => (ArtemisDevice) GetValue(DeviceProperty); - set => SetValue(DeviceProperty, value); - } + if (Device == null) + return; - /// - /// Gets or sets whether or not to show per-LED colors - /// - public bool ShowColors - { - get => (bool) GetValue(ShowColorsProperty); - set => SetValue(ShowColorsProperty, value); - } + // Determine the scale required to fit the desired size of the control + double scale = Math.Min(Bounds.Width / _deviceBounds.Width, Bounds.Height / _deviceBounds.Height); - /// - /// Gets or sets a list of LEDs to highlight - /// - public ObservableCollection? HighlightedLeds - { - get => (ObservableCollection) GetValue(HighlightedLedsProperty); - set => SetValue(HighlightedLedsProperty, value); + DrawingContext.PushedState? boundsPush = null; + try + { + // Scale the visualization in the desired bounding box + if (Bounds.Width > 0 && Bounds.Height > 0) + boundsPush = drawingContext.PushPreTransform(Matrix.CreateScale(scale, scale)); + + // Apply device rotation + using DrawingContext.PushedState translationPush = drawingContext.PushPreTransform(Matrix.CreateTranslation(0 - _deviceBounds.Left, 0 - _deviceBounds.Top)); + using DrawingContext.PushedState rotationPush = drawingContext.PushPreTransform(Matrix.CreateRotation(Matrix.ToRadians(Device.Rotation))); + + // Apply device scale + using DrawingContext.PushedState scalePush = drawingContext.PushPreTransform(Matrix.CreateScale(Device.Scale, Device.Scale)); + + // Render device and LED images + if (_deviceImage != null) + { + drawingContext.DrawImage( + _deviceImage, + new Rect(_deviceImage.Size), + new Rect(0, 0, Device.RgbDevice.ActualSize.Width, Device.RgbDevice.ActualSize.Height), + RenderOptions.GetBitmapInterpolationMode(this) + ); + } + + if (!ShowColors) + return; + + foreach (DeviceVisualizerLed deviceVisualizerLed in _deviceVisualizerLeds) + deviceVisualizerLed.RenderGeometry(drawingContext, false); + } + finally + { + boundsPush?.Dispose(); + } } /// @@ -96,54 +95,6 @@ namespace Artemis.UI.Shared /// public event EventHandler? LedClicked; - /// - protected override void OnRender(DrawingContext drawingContext) - { - if (Device == null) - return; - - // Determine the scale required to fit the desired size of the control - Size measureSize = MeasureDevice(); - double scale = Math.Min(RenderSize.Width / measureSize.Width, RenderSize.Height / measureSize.Height); - - // Scale the visualization in the desired bounding box - if (RenderSize.Width > 0 && RenderSize.Height > 0) - drawingContext.PushTransform(new ScaleTransform(scale, scale)); - - // Determine the offset required to rotate within bounds - Rect rotationRect = new(0, 0, Device.RgbDevice.ActualSize.Width, Device.RgbDevice.ActualSize.Height); - rotationRect.Transform(new RotateTransform(Device.Rotation).Value); - - // Apply device rotation - drawingContext.PushTransform(new TranslateTransform(0 - rotationRect.Left, 0 - rotationRect.Top)); - drawingContext.PushTransform(new RotateTransform(Device.Rotation)); - - // Apply device scale - drawingContext.PushTransform(new ScaleTransform(Device.Scale, Device.Scale)); - - // Render device and LED images - if (_deviceImage != null) - drawingContext.DrawImage(_deviceImage, new Rect(0, 0, Device.RgbDevice.Size.Width, Device.RgbDevice.Size.Height)); - - foreach (DeviceVisualizerLed deviceVisualizerLed in _deviceVisualizerLeds) - deviceVisualizerLed.RenderImage(drawingContext); - - drawingContext.DrawDrawing(_backingStore); - } - - /// - protected override Size MeasureOverride(Size availableSize) - { - if (Device == null) - return Size.Empty; - - Size deviceSize = MeasureDevice(); - if (deviceSize.Width <= 0 || deviceSize.Height <= 0) - return Size.Empty; - - return ResizeKeepAspect(deviceSize, availableSize.Width, availableSize.Height); - } - /// /// Invokes the event /// @@ -153,72 +104,37 @@ namespace Artemis.UI.Shared LedClicked?.Invoke(this, e); } - /// - /// Releases the unmanaged resources used by the object and optionally releases the managed resources. - /// - /// - /// to release both managed and unmanaged resources; - /// to release only unmanaged resources. - /// - protected virtual void Dispose(bool disposing) + private void Update() { - if (disposing) - _timer.Stop(); + InvalidateVisual(); } - private static Size ResizeKeepAspect(Size src, double maxWidth, double maxHeight) - { - double scale; - if (double.IsPositiveInfinity(maxWidth) && !double.IsPositiveInfinity(maxHeight)) - scale = maxHeight / src.Height; - else if (!double.IsPositiveInfinity(maxWidth) && double.IsPositiveInfinity(maxHeight)) - scale = maxWidth / src.Width; - else if (double.IsPositiveInfinity(maxWidth) && double.IsPositiveInfinity(maxHeight)) - return src; - else - scale = Math.Min(maxWidth / src.Width, maxHeight / src.Height); - - return new Size(src.Width * scale, src.Height * scale); - } - - private Size MeasureDevice() + private Rect MeasureDevice() { if (Device == null) - return Size.Empty; + return Rect.Empty; - Rect rotationRect = new(0, 0, Device.RgbDevice.ActualSize.Width, Device.RgbDevice.ActualSize.Height); - rotationRect.Transform(new RotateTransform(Device.Rotation).Value); + Rect deviceRect = new(0, 0, Device.RgbDevice.ActualSize.Width, Device.RgbDevice.ActualSize.Height); + Geometry geometry = new RectangleGeometry(deviceRect); + geometry.Transform = new RotateTransform(Device.Rotation); - return rotationRect.Size; + return geometry.Bounds; } - private void OnUnloaded(object? sender, RoutedEventArgs e) + private void TimerOnTick(object? sender, EventArgs e) { - _timer.Stop(); - _timer.Tick -= TimerOnTick; - - if (HighlightedLeds != null) - HighlightedLeds.CollectionChanged -= HighlightedLedsChanged; - if (_oldDevice != null) - { - if (Device != null) - { - Device.RgbDevice.PropertyChanged -= DevicePropertyChanged; - Device.DeviceUpdated -= DeviceUpdated; - } - - _oldDevice = null; - } + if (ShowColors && IsVisible && Opacity > 0) + Update(); } - private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e) + private void OnPointerReleased(object? sender, PointerReleasedEventArgs e) { if (Device == null) return; Point position = e.GetPosition(this); - double x = position.X / RenderSize.Width; - double y = position.Y / RenderSize.Height; + double x = position.X / Bounds.Width; + double y = position.Y / Bounds.Height; Point scaledPosition = new(x * Device.Rectangle.Width, y * Device.Rectangle.Height); DeviceVisualizerLed? deviceVisualizerLed = _deviceVisualizerLeds.FirstOrDefault(l => l.HitTest(scaledPosition)); @@ -226,154 +142,173 @@ namespace Artemis.UI.Shared OnLedClicked(new LedClickedEventArgs(deviceVisualizerLed.Led.Device, deviceVisualizerLed.Led)); } - private void OnLoaded(object? sender, RoutedEventArgs e) + private void DevicePropertyChanged(object? sender, PropertyChangedEventArgs e) { - _timer.Start(); - _timer.Tick += TimerOnTick; + Dispatcher.UIThread.Post(SetupForDevice, DispatcherPriority.Background); } - private void TimerOnTick(object? sender, EventArgs e) + private void DeviceUpdated(object? sender, EventArgs e) { - if (ShowColors && Visibility == Visibility.Visible) - Render(); + Dispatcher.UIThread.Post(SetupForDevice, DispatcherPriority.Background); } - private void Render() + #region Properties + + /// + /// Gets or sets the to display + /// + public static readonly StyledProperty DeviceProperty = + AvaloniaProperty.Register(nameof(Device), notifying: DeviceUpdated); + + private static void DeviceUpdated(IAvaloniaObject sender, bool before) { - DrawingContext drawingContext = _backingStore.Append(); - - if (_highlightedLeds.Any()) - { - foreach (DeviceVisualizerLed deviceVisualizerLed in _highlightedLeds) - deviceVisualizerLed.RenderColor(_backingStore, drawingContext, false); - - foreach (DeviceVisualizerLed deviceVisualizerLed in _dimmedLeds) - deviceVisualizerLed.RenderColor(_backingStore, drawingContext, true); - } - else - { - foreach (DeviceVisualizerLed deviceVisualizerLed in _deviceVisualizerLeds) - deviceVisualizerLed.RenderColor(_backingStore, drawingContext, false); - } - - drawingContext.Close(); + if (!before) + ((DeviceVisualizer) sender).SetupForDevice(); } - private void UpdateTransform() + /// + /// Gets or sets the to display + /// + public ArtemisDevice? Device { - InvalidateVisual(); - InvalidateMeasure(); + get => GetValue(DeviceProperty); + set => SetValue(DeviceProperty, value); } - private void SetupForDevice() + /// + /// Gets or sets boolean indicating whether or not to show per-LED colors + /// + public static readonly StyledProperty ShowColorsProperty = + AvaloniaProperty.Register(nameof(ShowColors)); + + /// + /// Gets or sets a boolean indicating whether or not to show per-LED colors + /// + public bool ShowColors { + get => GetValue(ShowColorsProperty); + set => SetValue(ShowColorsProperty, value); + } + + /// + /// Gets or sets a list of LEDs to highlight + /// + public static readonly StyledProperty?> HighlightedLedsProperty = + AvaloniaProperty.Register?>(nameof(HighlightedLeds)); + + /// + /// Gets or sets a list of LEDs to highlight + /// + public ObservableCollection? HighlightedLeds + { + get => GetValue(HighlightedLedsProperty); + set => SetValue(HighlightedLedsProperty, value); + } + + #endregion + + #region Lifetime management + + /// + protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) + { + _deviceImage?.Dispose(); _deviceImage = null; - _deviceVisualizerLeds.Clear(); - _highlightedLeds = new List(); - _dimmedLeds = new List(); - if (Device == null) - return; - - if (_oldDevice != null) + if (Device != null) { Device.RgbDevice.PropertyChanged -= DevicePropertyChanged; Device.DeviceUpdated -= DeviceUpdated; } + base.OnDetachedFromVisualTree(e); + } + + /// + protected override void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e) + { + _timer.Start(); + _timer.Tick += TimerOnTick; + base.OnAttachedToLogicalTree(e); + } + + /// + protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e) + { + _timer.Stop(); + _timer.Tick -= TimerOnTick; + base.OnDetachedFromLogicalTree(e); + } + + private void SetupForDevice() + { + _deviceImage?.Dispose(); + _deviceImage = null; + _deviceVisualizerLeds.Clear(); + _highlightedLeds = new List(); + _dimmedLeds = new List(); + + if (_oldDevice != null) + { + _oldDevice.RgbDevice.PropertyChanged -= DevicePropertyChanged; + _oldDevice.DeviceUpdated -= DeviceUpdated; + } + _oldDevice = Device; + if (Device == null) + return; + + _deviceBounds = MeasureDevice(); Device.RgbDevice.PropertyChanged += DevicePropertyChanged; Device.DeviceUpdated += DeviceUpdated; - UpdateTransform(); - - // Load the device main image - if (Device.Layout?.Image != null && File.Exists(Device.Layout.Image.LocalPath)) - _deviceImage = new BitmapImage(Device.Layout.Image); // Create all the LEDs foreach (ArtemisLed artemisLed in Device.Leds) _deviceVisualizerLeds.Add(new DeviceVisualizerLed(artemisLed)); - if (!ShowColors) + // Load the device main image on a background thread + ArtemisDevice? device = Device; + Task.Run(() => { - InvalidateMeasure(); - return; - } + if (device.Layout?.Image == null || !File.Exists(device.Layout.Image.LocalPath)) + return; - // Create the opacity drawing group - DrawingGroup opacityDrawingGroup = new(); - DrawingContext drawingContext = opacityDrawingGroup.Open(); - foreach (DeviceVisualizerLed deviceVisualizerLed in _deviceVisualizerLeds) - deviceVisualizerLed.RenderOpacityMask(drawingContext); - drawingContext.Close(); + try + { + // Create a bitmap that'll be used to render the device and LED images just once + RenderTargetBitmap renderTargetBitmap = new(new PixelSize((int) device.RgbDevice.Size.Width * 4, (int) device.RgbDevice.Size.Height * 4)); - // Render the store as a bitmap - DrawingImage drawingImage = new(opacityDrawingGroup); - Image image = new() {Source = drawingImage}; - RenderTargetBitmap bitmap = new( - Math.Max(1, (int) (opacityDrawingGroup.Bounds.Width * 2.5)), - Math.Max(1, (int) (opacityDrawingGroup.Bounds.Height * 2.5)), - 96, - 96, - PixelFormats.Pbgra32 - ); - image.Arrange(new Rect(0, 0, bitmap.Width, bitmap.Height)); - bitmap.Render(image); - bitmap.Freeze(); + using IDrawingContextImpl context = renderTargetBitmap.CreateDrawingContext(new ImmediateRenderer(this)); + using Bitmap bitmap = new(device.Layout.Image.LocalPath); + context.DrawBitmap(bitmap.PlatformImpl, 1, new Rect(bitmap.Size), new Rect(renderTargetBitmap.Size), BitmapInterpolationMode.HighQuality); + foreach (DeviceVisualizerLed deviceVisualizerLed in _deviceVisualizerLeds) + deviceVisualizerLed.DrawBitmap(context); - // Set the bitmap as the opacity mask for the colors backing store - ImageBrush bitmapBrush = new(bitmap); - bitmapBrush.Freeze(); - _backingStore.OpacityMask = bitmapBrush; - _backingStore.Children.Clear(); + _deviceImage = renderTargetBitmap; - InvalidateMeasure(); + Dispatcher.UIThread.Post(InvalidateMeasure); + } + catch + { + // ignored + } + }); } - private void DeviceUpdated(object? sender, EventArgs e) + /// + protected override Size MeasureOverride(Size availableSize) { - Dispatcher.Invoke(SetupForDevice); + if (_deviceBounds.Width <= 0 || _deviceBounds.Height <= 0) + return new Size(0, 0); + + double availableWidth = double.IsInfinity(availableSize.Width) ? _deviceBounds.Width : availableSize.Width; + double availableHeight = double.IsInfinity(availableSize.Height) ? _deviceBounds.Height : availableSize.Height; + double bestRatio = Math.Min(availableWidth / _deviceBounds.Width, availableHeight / _deviceBounds.Height); + + return new Size(_deviceBounds.Width * bestRatio, _deviceBounds.Height * bestRatio); } - private void DevicePropertyChanged(object? sender, PropertyChangedEventArgs e) - { - Dispatcher.Invoke(SetupForDevice); - } - - private static void DevicePropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - DeviceVisualizer deviceVisualizer = (DeviceVisualizer) d; - deviceVisualizer.Dispatcher.Invoke(() => { deviceVisualizer.SetupForDevice(); }); - } - - private static void ShowColorsPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - DeviceVisualizer deviceVisualizer = (DeviceVisualizer) d; - deviceVisualizer.Dispatcher.Invoke(() => { deviceVisualizer.SetupForDevice(); }); - } - - private static void HighlightedLedsPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - DeviceVisualizer deviceVisualizer = (DeviceVisualizer) d; - if (e.OldValue is ObservableCollection oldCollection) - oldCollection.CollectionChanged -= deviceVisualizer.HighlightedLedsChanged; - if (e.NewValue is ObservableCollection newCollection) - newCollection.CollectionChanged += deviceVisualizer.HighlightedLedsChanged; - } - - private void HighlightedLedsChanged(object? sender, NotifyCollectionChangedEventArgs notifyCollectionChangedEventArgs) - { - if (HighlightedLeds != null) - { - _highlightedLeds = _deviceVisualizerLeds.Where(l => HighlightedLeds.Contains(l.Led)).ToList(); - _dimmedLeds = _deviceVisualizerLeds.Where(l => !HighlightedLeds.Contains(l.Led)).ToList(); - } - else - { - _highlightedLeds = new List(); - _dimmedLeds = new List(); - } - } + #endregion } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Controls/DeviceVisualizerLed.cs b/src/Artemis.UI.Shared/Controls/DeviceVisualizerLed.cs index b6cdae397..9ccc4bcb6 100644 --- a/src/Artemis.UI.Shared/Controls/DeviceVisualizerLed.cs +++ b/src/Artemis.UI.Shared/Controls/DeviceVisualizerLed.cs @@ -1,24 +1,23 @@ using System; using System.IO; -using System.Windows; -using System.Windows.Media; -using System.Windows.Media.Imaging; using Artemis.Core; +using Avalonia; +using Avalonia.Media; +using Avalonia.Media.Imaging; +using Avalonia.Platform; +using Avalonia.Visuals.Media.Imaging; using RGB.NET.Core; -using Color = System.Windows.Media.Color; -using Point = System.Windows.Point; -using SolidColorBrush = System.Windows.Media.SolidColorBrush; +using Color = Avalonia.Media.Color; +using Point = Avalonia.Point; +using SolidColorBrush = Avalonia.Media.SolidColorBrush; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Controls { internal class DeviceVisualizerLed { - private const byte Dimmed = 100; - private const byte NonDimmed = 255; - private GeometryDrawing? _geometryDrawing; - private DrawingGroup? _lastBackingStore; - private Color _renderColor; - private SolidColorBrush? _renderColorBrush; + private readonly SolidColorBrush _penBrush; + private readonly SolidColorBrush _fillBrush; + private readonly Pen _pen; public DeviceVisualizerLed(ArtemisLed led) { @@ -30,83 +29,63 @@ namespace Artemis.UI.Shared Led.RgbLed.Size.Height ); - if (Led.Layout?.Image != null && File.Exists(Led.Layout.Image.LocalPath)) - LedImage = new BitmapImage(Led.Layout.Image); + _fillBrush = new SolidColorBrush(); + _penBrush = new SolidColorBrush(); + _pen = new Pen(_penBrush) {LineJoin = PenLineJoin.Round}; CreateLedGeometry(); } - public ArtemisLed Led { get; } public Rect LedRect { get; set; } - public BitmapImage? LedImage { get; set; } public Geometry? DisplayGeometry { get; private set; } - public void RenderColor(DrawingGroup backingStore, DrawingContext drawingContext, bool isDimmed) + public void DrawBitmap(IDrawingContextImpl drawingContext) { - if (DisplayGeometry == null || backingStore == null) + if (Led.Layout?.Image == null || !File.Exists(Led.Layout.Image.LocalPath)) return; - _renderColorBrush ??= new SolidColorBrush(); - _geometryDrawing ??= new GeometryDrawing(_renderColorBrush, null, new RectangleGeometry(LedRect)); + try + { + using Bitmap bitmap = new(Led.Layout.Image.LocalPath); + drawingContext.DrawBitmap( + bitmap.PlatformImpl, + 1, + new Rect(bitmap.Size), + new Rect(Led.RgbLed.Location.X * 4, Led.RgbLed.Location.Y * 4, Led.RgbLed.Size.Width * 4, Led.RgbLed.Size.Height * 4), + BitmapInterpolationMode.HighQuality + ); + } + catch + { + // ignored + } + } + public void RenderGeometry(DrawingContext drawingContext, bool dimmed) + { byte r = Led.RgbLed.Color.GetR(); byte g = Led.RgbLed.Color.GetG(); byte b = Led.RgbLed.Color.GetB(); - _renderColor.A = isDimmed ? Dimmed : NonDimmed; - _renderColor.R = r; - _renderColor.G = g; - _renderColor.B = b; - _renderColorBrush.Color = _renderColor; - - if (_lastBackingStore != backingStore) + if (dimmed) { - backingStore.Children.Add(_geometryDrawing); - _lastBackingStore = backingStore; + _fillBrush.Color = new Color(50, r, g, b); + _penBrush.Color = new Color(100, r, g, b); + } + else + { + _fillBrush.Color = new Color(100, r, g, b); + _penBrush.Color = new Color(255, r, g, b); } - } - public void RenderImage(DrawingContext drawingContext) - { - if (LedImage == null) - return; - - drawingContext.DrawImage(LedImage, LedRect); - } - - public void RenderOpacityMask(DrawingContext drawingContext) - { - if (DisplayGeometry == null) - return; - - SolidColorBrush fillBrush = new(Color.FromArgb(100, 255, 255, 255)); - fillBrush.Freeze(); - SolidColorBrush penBrush = new(Color.FromArgb(255, 255, 255, 255)); - penBrush.Freeze(); - - // Create transparent pixels covering the entire LedRect so the image size matched the LedRect size - drawingContext.DrawRectangle(new SolidColorBrush(Colors.Transparent), new Pen(new SolidColorBrush(Colors.Transparent), 1), LedRect); - // Translate to the top-left of the LedRect - drawingContext.PushTransform(new TranslateTransform(LedRect.X, LedRect.Y)); // Render the LED geometry - drawingContext.DrawGeometry(fillBrush, new Pen(penBrush, 1) {LineJoin = PenLineJoin.Round}, DisplayGeometry.GetOutlinedPathGeometry()); - // Restore the drawing context - drawingContext.Pop(); + drawingContext.DrawGeometry(_fillBrush, _pen, DisplayGeometry); } public bool HitTest(Point position) { - if (DisplayGeometry == null) - return false; - - PathGeometry translatedGeometry = Geometry.Combine( - Geometry.Empty, - DisplayGeometry, - GeometryCombineMode.Union, - new TranslateTransform(Led.RgbLed.Location.X, Led.RgbLed.Location.Y) - ); - return translatedGeometry.FillContains(position); + return DisplayGeometry != null && DisplayGeometry.FillContains(position); } private void CreateLedGeometry() @@ -139,17 +118,17 @@ namespace Artemis.UI.Shared private void CreateRectangleGeometry() { - DisplayGeometry = new RectangleGeometry(new Rect(0.5, 0.5, Led.RgbLed.Size.Width - 1, Led.RgbLed.Size.Height - 1)); + DisplayGeometry = new RectangleGeometry(new Rect(Led.RgbLed.Location.X + 0.5, Led.RgbLed.Location.Y + 0.5, Led.RgbLed.Size.Width - 1, Led.RgbLed.Size.Height - 1)); } private void CreateCircleGeometry() { - DisplayGeometry = new EllipseGeometry(new Rect(0.5, 0.5, Led.RgbLed.Size.Width - 1, Led.RgbLed.Size.Height - 1)); + DisplayGeometry = new EllipseGeometry(new Rect(Led.RgbLed.Location.X + 0.5, Led.RgbLed.Location.Y + 0.5, Led.RgbLed.Size.Width - 1, Led.RgbLed.Size.Height - 1)); } private void CreateKeyCapGeometry() { - DisplayGeometry = new RectangleGeometry(new Rect(1, 1, Led.RgbLed.Size.Width - 2, Led.RgbLed.Size.Height - 2), 1.6, 1.6); + DisplayGeometry = new RectangleGeometry(new Rect(Led.RgbLed.Location.X + 1, Led.RgbLed.Location.Y + 1, Led.RgbLed.Size.Width - 2, Led.RgbLed.Size.Height - 2)); } private void CreateCustomGeometry(double deflateAmount) @@ -158,36 +137,17 @@ namespace Artemis.UI.Shared { double width = Led.RgbLed.Size.Width - deflateAmount; double height = Led.RgbLed.Size.Height - deflateAmount; - // DisplayGeometry = Geometry.Parse(Led.RgbLed.ShapeData); - DisplayGeometry = Geometry.Combine( - Geometry.Empty, - Geometry.Parse(Led.RgbLed.ShapeData), - GeometryCombineMode.Union, - new TransformGroup + + Geometry geometry = Geometry.Parse(Led.RgbLed.ShapeData); + geometry.Transform = new TransformGroup + { + Children = new Transforms { - Children = new TransformCollection - { - new ScaleTransform(width, height), - new TranslateTransform(deflateAmount / 2, deflateAmount / 2) - } + new ScaleTransform(width, height), + new TranslateTransform(Led.RgbLed.Location.X + deflateAmount / 2, Led.RgbLed.Location.Y + deflateAmount / 2) } - ); - - if (DisplayGeometry.Bounds.Width > width) - { - DisplayGeometry = Geometry.Combine(Geometry.Empty, DisplayGeometry, GeometryCombineMode.Union, new TransformGroup - { - Children = new TransformCollection {new ScaleTransform(width / DisplayGeometry.Bounds.Width, 1)} - }); - } - - if (DisplayGeometry.Bounds.Height > height) - { - DisplayGeometry = Geometry.Combine(Geometry.Empty, DisplayGeometry, GeometryCombineMode.Union, new TransformGroup - { - Children = new TransformCollection {new ScaleTransform(1, height / DisplayGeometry.Bounds.Height)} - }); - } + }; + DisplayGeometry = geometry; } catch (Exception) { diff --git a/src/Artemis.UI.Shared/Controls/DraggableFloat.xaml b/src/Artemis.UI.Shared/Controls/DraggableFloat.xaml deleted file mode 100644 index e7dcffe2d..000000000 --- a/src/Artemis.UI.Shared/Controls/DraggableFloat.xaml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Controls/DraggableFloat.xaml.cs b/src/Artemis.UI.Shared/Controls/DraggableFloat.xaml.cs deleted file mode 100644 index 499afb5d7..000000000 --- a/src/Artemis.UI.Shared/Controls/DraggableFloat.xaml.cs +++ /dev/null @@ -1,303 +0,0 @@ -using System; -using System.ComponentModel; -using System.Globalization; -using System.Runtime.CompilerServices; -using System.Text.RegularExpressions; -using System.Windows; -using System.Windows.Input; - -namespace Artemis.UI.Shared -{ - /// - /// Interaction logic for DraggableFloat.xaml - /// - public partial class DraggableFloat : INotifyPropertyChanged - { - /// - /// Gets or sets the current value - /// - public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(nameof(Value), typeof(float), typeof(DraggableFloat), - new FrameworkPropertyMetadata(default(float), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, FloatPropertyChangedCallback)); - - /// - /// Gets or sets the step size when dragging - /// - public static readonly DependencyProperty StepSizeProperty = DependencyProperty.Register(nameof(StepSize), typeof(float), typeof(DraggableFloat)); - - /// - /// Gets or sets the minimum value - /// - public static readonly DependencyProperty MinProperty = DependencyProperty.Register(nameof(Min), typeof(object), typeof(DraggableFloat)); - - /// - /// Gets or sets the maximum value - /// - public static readonly DependencyProperty MaxProperty = DependencyProperty.Register(nameof(Max), typeof(object), typeof(DraggableFloat)); - - /// - /// Occurs when the value has changed - /// - public static readonly RoutedEvent ValueChangedEvent = - EventManager.RegisterRoutedEvent( - nameof(Value), - RoutingStrategy.Bubble, - typeof(RoutedPropertyChangedEventHandler), - typeof(DraggableFloat)); - - private readonly Regex _inputRegex = new("^[.][-|0-9]+$|^-?[0-9]*[.]{0,1}[0-9]*$"); - - private bool _calledDragStarted; - - private bool _inCallback; - private Point _mouseDragStartPoint; - private float _startValue; - - /// - /// Creates a new instance of the class - /// - public DraggableFloat() - { - InitializeComponent(); - } - - /// - /// Gets or sets the current value - /// - public float Value - { - get => (float) GetValue(ValueProperty); - set => SetValue(ValueProperty, value); - } - - /// - /// Gets or sets the current value as a string - /// - public string InputValue - { - get => Value.ToString("N3", CultureInfo.InvariantCulture); - set => UpdateValue(value); - } - - /// - /// Gets or sets the step size when dragging - /// - public float StepSize - { - get => (float) GetValue(StepSizeProperty); - set => SetValue(StepSizeProperty, value); - } - - /// - /// Gets or sets the minimum value - /// - public object? Min - { - get => (object?) GetValue(MinProperty); - set => SetValue(MinProperty, value); - } - - /// - /// Gets or sets the maximum value - /// - public object? Max - { - get => (object?) GetValue(MaxProperty); - set => SetValue(MaxProperty, value); - } - - private void UpdateValue(string value) - { - if (!float.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out float parsedResult)) - return; - - Value = parsedResult; - OnPropertyChanged(nameof(InputValue)); - } - - - private void DisplayInput() - { - DragHandle.Visibility = Visibility.Collapsed; - DraggableFloatInputTextBox.Visibility = Visibility.Visible; - DraggableFloatInputTextBox.Focus(); - DraggableFloatInputTextBox.SelectAll(); - } - - private void DisplayDragHandle() - { - DraggableFloatInputTextBox.Visibility = Visibility.Collapsed; - DragHandle.Visibility = Visibility.Visible; - } - - - /// - /// Rounds the provided decimal to the nearest value of x with a given threshold - /// Source: https://stackoverflow.com/a/25922075/5015269 - /// - /// The value to round - /// The value to round down towards - private static decimal RoundToNearestOf(decimal input, decimal nearestOf) - { - return Math.Floor(input / nearestOf + 0.5m) * nearestOf; - } - - #region Event handlers - - private static void FloatPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - DraggableFloat draggableFloat = (DraggableFloat) d; - if (draggableFloat._inCallback) - return; - - draggableFloat._inCallback = true; - draggableFloat.OnPropertyChanged(nameof(Value)); - draggableFloat.OnPropertyChanged(nameof(InputValue)); - draggableFloat._inCallback = false; - } - - private void InputMouseDown(object sender, MouseButtonEventArgs e) - { - e.Handled = true; - - _startValue = Value; - ((IInputElement) sender).CaptureMouse(); - _mouseDragStartPoint = e.GetPosition((IInputElement) sender); - } - - private void InputMouseUp(object sender, MouseButtonEventArgs e) - { - e.Handled = true; - - Point position = e.GetPosition((IInputElement) sender); - if (position == _mouseDragStartPoint) - { - DisplayInput(); - } - else - { - OnDragEnded(); - _calledDragStarted = false; - } - - ((IInputElement) sender).ReleaseMouseCapture(); - } - - private void InputMouseMove(object sender, MouseEventArgs e) - { - if (e.LeftButton != MouseButtonState.Pressed) - return; - - e.Handled = true; - - if (!_calledDragStarted) - { - OnDragStarted(); - _calledDragStarted = true; - } - - // Use decimals for everything to avoid floating point errors - decimal startValue = new(_startValue); - decimal startX = new(_mouseDragStartPoint.X); - decimal x = new(e.GetPosition((IInputElement) sender).X); - decimal stepSize = new(StepSize); - if (stepSize == 0) - stepSize = 0.1m; - - if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)) - stepSize = stepSize * 10; - - float value = (float) RoundToNearestOf(startValue + stepSize * (x - startX), stepSize); - - if (Min != null && float.TryParse(Min.ToString(), out float minFloat)) - value = Math.Max(value, minFloat); - if (Max != null && float.TryParse(Max.ToString(), out float maxFloat)) - value = Math.Min(value, maxFloat); - - Value = value; - } - - private void InputLostFocus(object sender, RoutedEventArgs e) - { - DisplayDragHandle(); - } - - private void InputKeyDown(object sender, KeyEventArgs e) - { - if (e.Key == Key.Enter) - { - DisplayDragHandle(); - } - else if (e.Key == Key.Escape) - { - DraggableFloatInputTextBox.Text = _startValue.ToString(CultureInfo.InvariantCulture); - DisplayDragHandle(); - } - } - - private void Input_OnRequestBringIntoView(object sender, RequestBringIntoViewEventArgs e) - { - e.Handled = true; - } - - private void Input_PreviewTextInput(object sender, TextCompositionEventArgs e) - { - e.Handled = !_inputRegex.IsMatch(e.Text); - } - - private void Input_OnPasting(object sender, DataObjectPastingEventArgs e) - { - if (e.DataObject.GetDataPresent(typeof(string))) - { - if (e.DataObject.GetData(typeof(string)) is string text && !_inputRegex.IsMatch(text)) - e.CancelCommand(); - } - else - { - e.CancelCommand(); - } - } - - #endregion - - #region Events - - /// - public event PropertyChangedEventHandler? PropertyChanged; - - /// - /// Occurs when dragging has started - /// - public event EventHandler? DragStarted; - - /// - /// Occurs when dragging has ended - /// - public event EventHandler? DragEnded; - - /// - /// Invokes the event - /// - protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - - /// - /// Invokes the event - /// - protected virtual void OnDragStarted() - { - DragStarted?.Invoke(this, EventArgs.Empty); - } - - /// - /// Invokes the event - /// - protected virtual void OnDragEnded() - { - DragEnded?.Invoke(this, EventArgs.Empty); - } - - #endregion - } -} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/EnumComboBox.axaml b/src/Artemis.UI.Shared/Controls/EnumComboBox.axaml similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/EnumComboBox.axaml rename to src/Artemis.UI.Shared/Controls/EnumComboBox.axaml diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/EnumComboBox.axaml.cs b/src/Artemis.UI.Shared/Controls/EnumComboBox.axaml.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/EnumComboBox.axaml.cs rename to src/Artemis.UI.Shared/Controls/EnumComboBox.axaml.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/Flyouts/DataModelPickerFlyout.cs b/src/Artemis.UI.Shared/Controls/Flyouts/DataModelPickerFlyout.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/Flyouts/DataModelPickerFlyout.cs rename to src/Artemis.UI.Shared/Controls/Flyouts/DataModelPickerFlyout.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/Flyouts/GradientPickerFlyout.cs b/src/Artemis.UI.Shared/Controls/Flyouts/GradientPickerFlyout.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/Flyouts/GradientPickerFlyout.cs rename to src/Artemis.UI.Shared/Controls/Flyouts/GradientPickerFlyout.cs diff --git a/src/Artemis.UI.Shared/Controls/GradientPicker.xaml b/src/Artemis.UI.Shared/Controls/GradientPicker.xaml deleted file mode 100644 index c13770ec8..000000000 --- a/src/Artemis.UI.Shared/Controls/GradientPicker.xaml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Controls/GradientPicker.xaml.cs b/src/Artemis.UI.Shared/Controls/GradientPicker.xaml.cs deleted file mode 100644 index aaedaa6bc..000000000 --- a/src/Artemis.UI.Shared/Controls/GradientPicker.xaml.cs +++ /dev/null @@ -1,171 +0,0 @@ -using System; -using System.Collections.Specialized; -using System.ComponentModel; -using System.Runtime.CompilerServices; -using System.Windows; -using System.Windows.Input; -using System.Windows.Media; -using Artemis.Core; -using Artemis.UI.Shared.Properties; -using Artemis.UI.Shared.Services; -using Stylet; - -namespace Artemis.UI.Shared -{ - /// - /// Interaction logic for GradientPicker.xaml - /// - public partial class GradientPicker : INotifyPropertyChanged - { - private static IColorPickerService? _colorPickerService; - private bool _inCallback; - private ColorGradientToGradientStopsConverter _gradientConverter; - - /// - /// Creates a new instance of the class - /// - public GradientPicker() - { - _gradientConverter = new ColorGradientToGradientStopsConverter(); - InitializeComponent(); - Unloaded += OnUnloaded; - } - - /// - /// Gets or sets the color gradient - /// - public ColorGradient ColorGradient - { - get => (ColorGradient) GetValue(ColorGradientProperty); - set => SetValue(ColorGradientProperty, value); - } - - /// - /// Gets or sets the dialog host in which to show the gradient dialog - /// - public string DialogHost - { - get => (string) GetValue(DialogHostProperty); - set => SetValue(DialogHostProperty, value); - } - - /// - /// Used by the gradient picker to load saved gradients, do not touch or it'll just throw an exception - /// - internal static IColorPickerService ColorPickerService - { - set - { - if (_colorPickerService != null) - throw new AccessViolationException("This is not for you to touch"); - _colorPickerService = value; - } - } - - /// - /// Occurs when the dialog has opened - /// - public event EventHandler? DialogOpened; - - /// - /// Occurs when the dialog has closed - /// - public event EventHandler? DialogClosed; - - /// - /// Invokes the event - /// - [NotifyPropertyChangedInvocator] - protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - } - - /// - /// Invokes the event - /// - protected virtual void OnDialogOpened() - { - DialogOpened?.Invoke(this, EventArgs.Empty); - } - - /// - /// Invokes the event - /// - protected virtual void OnDialogClosed() - { - DialogClosed?.Invoke(this, EventArgs.Empty); - } - - private static void ColorGradientPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) - { - GradientPicker gradientPicker = (GradientPicker) d; - if (gradientPicker._inCallback) - return; - - gradientPicker._inCallback = true; - - if (e.OldValue is ColorGradient oldGradient) - oldGradient.CollectionChanged -= gradientPicker.GradientChanged; - if (e.NewValue is ColorGradient newGradient) - newGradient.CollectionChanged += gradientPicker.GradientChanged; - gradientPicker.UpdateGradientStops(); - gradientPicker.OnPropertyChanged(nameof(ColorGradient)); - - gradientPicker._inCallback = false; - } - - private void GradientChanged(object? sender, NotifyCollectionChangedEventArgs e) - { - Dispatcher.Invoke(UpdateGradientStops); - } - - private void UpdateGradientStops() - { - GradientPreview.GradientStops = (GradientStopCollection) _gradientConverter.Convert(ColorGradient, null!, null!, null!); - } - - private void UIElement_OnMouseUp(object sender, MouseButtonEventArgs e) - { - if (_colorPickerService == null) - return; - - Execute.OnUIThread(async () => - { - OnDialogOpened(); - await _colorPickerService.ShowGradientPicker(ColorGradient, DialogHost); - OnDialogClosed(); - }); - } - - private void OnUnloaded(object sender, RoutedEventArgs e) - { - ColorGradient.CollectionChanged -= GradientChanged; - } - - /// - public event PropertyChangedEventHandler? PropertyChanged; - - #region Static WPF fields - - /// - /// Gets or sets the color gradient - /// - public static readonly DependencyProperty ColorGradientProperty = DependencyProperty.Register(nameof(ColorGradient), typeof(ColorGradient), typeof(GradientPicker), - new FrameworkPropertyMetadata(default(ColorGradient), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, ColorGradientPropertyChangedCallback)); - - /// - /// Gets or sets the dialog host in which to show the gradient dialog - /// - public static readonly DependencyProperty DialogHostProperty = DependencyProperty.Register(nameof(DialogHost), typeof(string), typeof(GradientPicker), - new FrameworkPropertyMetadata(default(string))); - - /// - /// Occurs when the color gradient has changed - /// - public static readonly RoutedEvent ColorGradientChangedEvent = - EventManager.RegisterRoutedEvent(nameof(ColorGradient), RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler), typeof(GradientPicker)); - - #endregion - } -} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/GradientPicker/GradientPicker.cs b/src/Artemis.UI.Shared/Controls/GradientPicker/GradientPicker.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/GradientPicker/GradientPicker.cs rename to src/Artemis.UI.Shared/Controls/GradientPicker/GradientPicker.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/GradientPicker/GradientPickerButton.cs b/src/Artemis.UI.Shared/Controls/GradientPicker/GradientPickerButton.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/GradientPicker/GradientPickerButton.cs rename to src/Artemis.UI.Shared/Controls/GradientPicker/GradientPickerButton.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/GradientPicker/GradientPickerColorStop.cs b/src/Artemis.UI.Shared/Controls/GradientPicker/GradientPickerColorStop.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/GradientPicker/GradientPickerColorStop.cs rename to src/Artemis.UI.Shared/Controls/GradientPicker/GradientPickerColorStop.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/HotkeyBox.axaml b/src/Artemis.UI.Shared/Controls/HotkeyBox.axaml similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/HotkeyBox.axaml rename to src/Artemis.UI.Shared/Controls/HotkeyBox.axaml diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/HotkeyBox.axaml.cs b/src/Artemis.UI.Shared/Controls/HotkeyBox.axaml.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/HotkeyBox.axaml.cs rename to src/Artemis.UI.Shared/Controls/HotkeyBox.axaml.cs diff --git a/src/Artemis.UI.Shared/Controls/LockableToggleButton.cs b/src/Artemis.UI.Shared/Controls/LockableToggleButton.cs deleted file mode 100644 index 52748cc0e..000000000 --- a/src/Artemis.UI.Shared/Controls/LockableToggleButton.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Windows; -using System.Windows.Controls.Primitives; - -namespace Artemis.UI.Shared -{ - /// - /// Represents a toggle button that can be locked using a property - /// - public class LockableToggleButton : ToggleButton - { - /// - /// Gets or sets a boolean indicating whether the toggle button is locked - /// - public static readonly DependencyProperty IsLockedProperty = - DependencyProperty.Register("IsLocked", typeof(bool), typeof(LockableToggleButton), new UIPropertyMetadata(false)); - - /// - /// Gets or sets a boolean indicating whether the toggle button is locked - /// - public bool IsLocked - { - get => (bool) GetValue(IsLockedProperty); - set => SetValue(IsLockedProperty, value); - } - - /// - protected override void OnToggle() - { - if (!IsLocked) base.OnToggle(); - } - } -} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/NoInputTextBox.cs b/src/Artemis.UI.Shared/Controls/NoInputTextBox.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/NoInputTextBox.cs rename to src/Artemis.UI.Shared/Controls/NoInputTextBox.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml b/src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml rename to src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml.cs b/src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml.cs rename to src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.axaml.cs diff --git a/src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.xaml b/src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.xaml deleted file mode 100644 index 1572fc3d9..000000000 --- a/src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.xaml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.xaml.cs b/src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.xaml.cs deleted file mode 100644 index d63317f28..000000000 --- a/src/Artemis.UI.Shared/Controls/ProfileConfigurationIcon.xaml.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Windows; -using System.Windows.Controls; - -namespace Artemis.UI.Shared - -{ - /// - /// Interaction logic for ProfileConfigurationIcon.xaml - /// - public partial class ProfileConfigurationIcon : UserControl - { - /// - /// Gets or sets the to display - /// - public static readonly DependencyProperty ConfigurationIconProperty = - DependencyProperty.Register(nameof(ConfigurationIcon), typeof(Core.ProfileConfigurationIcon), typeof(ProfileConfigurationIcon)); - - /// - /// Creates a new instance of the class - /// - public ProfileConfigurationIcon() - { - InitializeComponent(); - } - - /// - /// Gets or sets the to display - /// - public Core.ProfileConfigurationIcon ConfigurationIcon - { - get => (Core.ProfileConfigurationIcon) GetValue(ConfigurationIconProperty); - set => SetValue(ConfigurationIconProperty, value); - } - } -} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/SelectionRectangle.cs b/src/Artemis.UI.Shared/Controls/SelectionRectangle.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Controls/SelectionRectangle.cs rename to src/Artemis.UI.Shared/Controls/SelectionRectangle.cs diff --git a/src/Artemis.UI.Shared/Converters/ColorGradientToGradientStopsConverter.cs b/src/Artemis.UI.Shared/Converters/ColorGradientToGradientStopsConverter.cs index 2a1c9de0a..29f562d47 100644 --- a/src/Artemis.UI.Shared/Converters/ColorGradientToGradientStopsConverter.cs +++ b/src/Artemis.UI.Shared/Converters/ColorGradientToGradientStopsConverter.cs @@ -1,46 +1,41 @@ using System; -using System.Collections.Generic; using System.Globalization; using System.Linq; -using System.Windows.Data; -using System.Windows.Media; using Artemis.Core; +using Avalonia.Data.Converters; +using Avalonia.Media; using SkiaSharp; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Converters; + +/// +/// Converts into a . +/// +public class ColorGradientToGradientStopsConverter : IValueConverter { /// - /// - /// Converts into a - /// . - /// - [ValueConversion(typeof(ColorGradient), typeof(GradientStopCollection))] - public class ColorGradientToGradientStopsConverter : IValueConverter + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { - /// - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - ColorGradient? colorGradient = value as ColorGradient; - GradientStopCollection collection = new(); - if (colorGradient == null) - return collection; - - foreach (ColorGradientStop c in colorGradient.OrderBy(s => s.Position)) - collection.Add(new GradientStop(Color.FromArgb(c.Color.Alpha, c.Color.Red, c.Color.Green, c.Color.Blue), c.Position)); + ColorGradient? colorGradient = value as ColorGradient; + GradientStops collection = new(); + if (colorGradient == null) return collection; - } - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - GradientStopCollection? collection = value as GradientStopCollection; - ColorGradient colorGradients = new(); - if (collection == null) - return colorGradients; + foreach (ColorGradientStop c in colorGradient.OrderBy(s => s.Position)) + collection.Add(new GradientStop(Color.FromArgb(c.Color.Alpha, c.Color.Red, c.Color.Green, c.Color.Blue), c.Position)); + return collection; + } - foreach (GradientStop c in collection.OrderBy(s => s.Offset)) - colorGradients.Add(new ColorGradientStop(new SKColor(c.Color.R, c.Color.G, c.Color.B, c.Color.A), (float) c.Offset)); + /// + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + GradientStops? collection = value as GradientStops; + ColorGradient colorGradients = new(); + if (collection == null) return colorGradients; - } + + foreach (GradientStop c in collection.OrderBy(s => s.Offset)) + colorGradients.Add(new ColorGradientStop(new SKColor(c.Color.R, c.Color.G, c.Color.B, c.Color.A), (float) c.Offset)); + return colorGradients; } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Converters/ColorToSKColorConverter.cs b/src/Artemis.UI.Shared/Converters/ColorToSKColorConverter.cs index 6f612d002..b09052e65 100644 --- a/src/Artemis.UI.Shared/Converters/ColorToSKColorConverter.cs +++ b/src/Artemis.UI.Shared/Converters/ColorToSKColorConverter.cs @@ -1,30 +1,38 @@ using System; using System.Globalization; -using System.Windows.Data; -using System.Windows.Media; +using Avalonia.Data.Converters; +using Avalonia.Media; +using FluentAvalonia.UI.Media; using SkiaSharp; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Converters { - /// /// - /// Converts into a . + /// Converts into . /// - [ValueConversion(typeof(Color), typeof(SKColor))] - public class SKColorToColorConverter : IValueConverter + public class ColorToSKColorConverter : IValueConverter { /// - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { - SKColor skColor = (SKColor) value; - return Color.FromArgb(skColor.Alpha, skColor.Red, skColor.Green, skColor.Blue); + if (value is Color avaloniaColor) + return new SKColor(avaloniaColor.R, avaloniaColor.G, avaloniaColor.B, avaloniaColor.A); + if (value is Color2 fluentAvaloniaColor) + return new SKColor(fluentAvaloniaColor.R, fluentAvaloniaColor.G, fluentAvaloniaColor.B, fluentAvaloniaColor.A); + + return SKColor.Empty; } /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) { - Color color = (Color) value; - return new SKColor(color.R, color.G, color.B, color.A); + Color result = new(0, 0, 0, 0); + if (value is SKColor skColor) + result = new Color(skColor.Alpha, skColor.Red, skColor.Green, skColor.Blue); + + if (targetType == typeof(Color2)) + return (Color2) result; + return result; } } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Converters/ColorToSolidColorConverter.cs b/src/Artemis.UI.Shared/Converters/ColorToSolidColorConverter.cs deleted file mode 100644 index 85fc3bdd0..000000000 --- a/src/Artemis.UI.Shared/Converters/ColorToSolidColorConverter.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; -using System.Windows.Media; - -namespace Artemis.UI.Shared -{ - /// - /// - /// Converts into a with full - /// opacity. - /// - [ValueConversion(typeof(Color), typeof(string))] - public class ColorToSolidColorConverter : IValueConverter - { - /// - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - Color color = (Color) value; - return Color.FromRgb(color.R, color.G, color.B); - } - - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Converters/ColorToStringConverter.cs b/src/Artemis.UI.Shared/Converters/ColorToStringConverter.cs deleted file mode 100644 index 4519d8b83..000000000 --- a/src/Artemis.UI.Shared/Converters/ColorToStringConverter.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; -using System.Windows.Media; - -namespace Artemis.UI.Shared -{ - /// - /// - /// Converts into . - /// - [ValueConversion(typeof(Color), typeof(string))] - public class ColorToStringConverter : IValueConverter - { - /// - public object? Convert(object? value, Type targetType, object parameter, CultureInfo culture) - { - return value?.ToString()?.ToUpper(); - } - - /// - public object? ConvertBack(object? value, Type targetType, object parameter, CultureInfo culture) - { - try - { - if (string.IsNullOrWhiteSpace(value as string)) - return default(Color); - - object? color = ColorConverter.ConvertFromString((string) value!); - if (color is Color c) - return c; - - return default(Color); - } - catch (FormatException) - { - return default(Color); - } - } - } -} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Converters/EnumToBooleanConverter.cs b/src/Artemis.UI.Shared/Converters/EnumToBooleanConverter.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Converters/EnumToBooleanConverter.cs rename to src/Artemis.UI.Shared/Converters/EnumToBooleanConverter.cs diff --git a/src/Artemis.UI.Shared/Converters/IntToVisibilityConverter.cs b/src/Artemis.UI.Shared/Converters/IntToVisibilityConverter.cs deleted file mode 100644 index 2db2cd50a..000000000 --- a/src/Artemis.UI.Shared/Converters/IntToVisibilityConverter.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Globalization; -using System.Windows; -using System.Windows.Data; - -namespace Artemis.UI.Shared -{ - /// - /// Converts to - /// - public class IntToVisibilityConverter : IValueConverter - { - /// - public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - Parameters direction; - if (parameter == null) - direction = Parameters.Normal; - else - direction = (Parameters) Enum.Parse(typeof(Parameters), (string) parameter); - - return direction == Parameters.Normal - ? value is > 1 ? Visibility.Visible : Visibility.Collapsed - : value is > 1 ? Visibility.Collapsed : Visibility.Visible; - } - - /// - public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - - private enum Parameters - { - Normal, - Inverted - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Converters/NullToVisibilityConverter.cs b/src/Artemis.UI.Shared/Converters/NullToVisibilityConverter.cs deleted file mode 100644 index dd70fbac2..000000000 --- a/src/Artemis.UI.Shared/Converters/NullToVisibilityConverter.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Globalization; -using System.Windows; -using System.Windows.Data; - -namespace Artemis.UI.Shared -{ - /// - /// Converts to - /// - public class NullToVisibilityConverter : IValueConverter - { - /// - public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - Parameters direction; - if (parameter == null) - direction = Parameters.Normal; - else - direction = (Parameters) Enum.Parse(typeof(Parameters), (string) parameter); - - if (value is string stringValue && string.IsNullOrWhiteSpace(stringValue)) - value = null; - - if (direction == Parameters.Normal) - return value == null ? Visibility.Collapsed : Visibility.Visible; - return value == null ? Visibility.Visible : Visibility.Collapsed; - } - - /// - public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - - private enum Parameters - { - Normal, - Inverted - } - } -} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Converters/ParentWidthPercentageConverter.cs b/src/Artemis.UI.Shared/Converters/ParentWidthPercentageConverter.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Converters/ParentWidthPercentageConverter.cs rename to src/Artemis.UI.Shared/Converters/ParentWidthPercentageConverter.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Converters/SKColorToBrushConverter.cs b/src/Artemis.UI.Shared/Converters/SKColorToBrushConverter.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Converters/SKColorToBrushConverter.cs rename to src/Artemis.UI.Shared/Converters/SKColorToBrushConverter.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Converters/SKColorToColorConverter.cs b/src/Artemis.UI.Shared/Converters/SKColorToColorConverter.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Converters/SKColorToColorConverter.cs rename to src/Artemis.UI.Shared/Converters/SKColorToColorConverter.cs diff --git a/src/Artemis.UI.Shared/Converters/SKColorToStringConverter.cs b/src/Artemis.UI.Shared/Converters/SKColorToStringConverter.cs index d1dbfcde8..7837c188e 100644 --- a/src/Artemis.UI.Shared/Converters/SKColorToStringConverter.cs +++ b/src/Artemis.UI.Shared/Converters/SKColorToStringConverter.cs @@ -1,31 +1,28 @@ using System; using System.Globalization; -using System.Windows.Data; -using System.Windows.Media; +using Avalonia.Data.Converters; using SkiaSharp; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Converters; + +/// +/// +/// Converts into . +/// +public class SKColorToStringConverter : IValueConverter { /// - /// - /// Converts into . - /// - [ValueConversion(typeof(Color), typeof(string))] - public class SKColorToStringConverter : IValueConverter + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { - /// - public object? Convert(object? value, Type targetType, object parameter, CultureInfo culture) - { - return value?.ToString(); - } + return value?.ToString(); + } - /// - public object ConvertBack(object? value, Type targetType, object parameter, CultureInfo culture) - { - if (string.IsNullOrWhiteSpace(value as string)) - return SKColor.Empty; + /// + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (string.IsNullOrWhiteSpace(value as string)) + return SKColor.Empty; - return SKColor.TryParse((string) value!, out SKColor color) ? color : SKColor.Empty; - } + return SKColor.TryParse((string) value!, out SKColor color) ? color : SKColor.Empty; } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Converters/StreamToBitmapImageConverter.cs b/src/Artemis.UI.Shared/Converters/StreamToBitmapImageConverter.cs deleted file mode 100644 index 9e4c7cb20..000000000 --- a/src/Artemis.UI.Shared/Converters/StreamToBitmapImageConverter.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Globalization; -using System.IO; -using System.Windows.Data; -using System.Windows.Media.Imaging; - -namespace Artemis.UI.Shared -{ - /// - /// - /// Converts bitmap file in the form of a into . - /// - [ValueConversion(typeof(Stream), typeof(BitmapImage))] - public class StreamToBitmapImageConverter : IValueConverter - { - /// - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value is not Stream stream) - return Binding.DoNothing; - - stream.Position = 0; - - BitmapImage selectedBitmap = new(); - selectedBitmap.BeginInit(); - selectedBitmap.StreamSource = stream; - selectedBitmap.CacheOption = BitmapCacheOption.OnLoad; - selectedBitmap.EndInit(); - selectedBitmap.Freeze(); - - stream.Position = 0; - return selectedBitmap; - } - - - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - return Binding.DoNothing; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Converters/StreamToSvgImageConverter.cs b/src/Artemis.UI.Shared/Converters/StreamToSvgImageConverter.cs deleted file mode 100644 index e157daa1f..000000000 --- a/src/Artemis.UI.Shared/Converters/StreamToSvgImageConverter.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.Globalization; -using System.IO; -using System.Windows.Data; -using System.Windows.Media.Imaging; -using SharpVectors.Converters; -using SharpVectors.Renderers.Wpf; - -namespace Artemis.UI.Shared -{ - /// - /// - /// Converts SVG file in the form of a into . - /// - [ValueConversion(typeof(Stream), typeof(BitmapImage))] - public class StreamToSvgImageConverter : IValueConverter - { - /// - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value is not Stream stream) - return Binding.DoNothing; - - stream.Position = 0; - - StreamSvgConverter converter = new(new WpfDrawingSettings()); - using MemoryStream imageStream = new(); - converter.Convert(stream, imageStream); - - BitmapImage selectedBitmap = new(); - selectedBitmap.BeginInit(); - selectedBitmap.StreamSource = imageStream; - selectedBitmap.CacheOption = BitmapCacheOption.OnLoad; - selectedBitmap.EndInit(); - selectedBitmap.Freeze(); - - stream.Position = 0; - return selectedBitmap; - } - - - /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - return Binding.DoNothing; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Converters/StringToNumericConverter.cs b/src/Artemis.UI.Shared/Converters/StringToNumericConverter.cs deleted file mode 100644 index ced2709ae..000000000 --- a/src/Artemis.UI.Shared/Converters/StringToNumericConverter.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Globalization; -using System.Windows.Data; -using Artemis.Core; - -namespace Artemis.UI.Shared -{ - /// - /// Converts into . - /// - [ValueConversion(typeof(string), typeof(Numeric))] - public class StringToNumericConverter : IValueConverter - { - /// - public object? Convert(object? value, Type targetType, object parameter, CultureInfo culture) - { - return value?.ToString(); - } - - /// - public object ConvertBack(object? value, Type targetType, object parameter, CultureInfo culture) - { - Numeric.TryParse(value as string, out Numeric result); - return result; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Converters/TypeToStringConverter.cs b/src/Artemis.UI.Shared/Converters/TypeToStringConverter.cs index 10570fa8a..8bec6ce70 100644 --- a/src/Artemis.UI.Shared/Converters/TypeToStringConverter.cs +++ b/src/Artemis.UI.Shared/Converters/TypeToStringConverter.cs @@ -1,9 +1,9 @@ using System; using System.Globalization; -using System.Windows.Data; using Artemis.Core; +using Avalonia.Data.Converters; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Converters { /// /// Converts into . @@ -11,7 +11,7 @@ namespace Artemis.UI.Shared public class TypeToStringConverter : IValueConverter { /// - public object? Convert(object value, Type targetType, object? parameter, CultureInfo culture) + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { bool humanizeProvided = bool.TryParse(parameter?.ToString(), out bool humanize); if (value is Type type) @@ -21,7 +21,7 @@ namespace Artemis.UI.Shared } /// - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) { throw new NotImplementedException(); } diff --git a/src/Avalonia/Artemis.UI.Shared/Converters/WidthNormalizedConverter.cs b/src/Artemis.UI.Shared/Converters/WidthNormalizedConverter.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Converters/WidthNormalizedConverter.cs rename to src/Artemis.UI.Shared/Converters/WidthNormalizedConverter.cs diff --git a/src/Artemis.UI.Shared/DataModelVisualization/DataModelDisplayViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/DataModelDisplayViewModel.cs index abbc4171d..6dd1d3ded 100644 --- a/src/Artemis.UI.Shared/DataModelVisualization/DataModelDisplayViewModel.cs +++ b/src/Artemis.UI.Shared/DataModelVisualization/DataModelDisplayViewModel.cs @@ -1,8 +1,8 @@ using System.Diagnostics.CodeAnalysis; using Artemis.Core.Modules; -using Stylet; +using ReactiveUI; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.DataModelVisualization { /// /// Represents a display view model @@ -10,8 +10,7 @@ namespace Artemis.UI.Shared /// The type of the data model public abstract class DataModelDisplayViewModel : DataModelDisplayViewModel { - [AllowNull] - private T _displayValue = default!; + [AllowNull] private T _displayValue = default!; /// /// Gets or sets value that the view model must display @@ -22,7 +21,8 @@ namespace Artemis.UI.Shared get => _displayValue; set { - if (!SetAndNotify(ref _displayValue, value)) return; + if (Equals(value, _displayValue)) return; + RaiseAndSetIfChanged(ref _displayValue, value); OnDisplayValueUpdated(); } } @@ -46,7 +46,7 @@ namespace Artemis.UI.Shared /// /// For internal use only, implement instead. /// - public abstract class DataModelDisplayViewModel : PropertyChangedBase + public abstract class DataModelDisplayViewModel : ViewModelBase { private DataModelPropertyAttribute? _propertyDescription; @@ -56,7 +56,7 @@ namespace Artemis.UI.Shared public DataModelPropertyAttribute? PropertyDescription { get => _propertyDescription; - internal set => SetAndNotify(ref _propertyDescription, value); + internal set => RaiseAndSetIfChanged(ref _propertyDescription, value); } /// diff --git a/src/Artemis.UI.Shared/DataModelVisualization/DataModelInputViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/DataModelInputViewModel.cs index 1c9574dfb..cd3bd505c 100644 --- a/src/Artemis.UI.Shared/DataModelVisualization/DataModelInputViewModel.cs +++ b/src/Artemis.UI.Shared/DataModelVisualization/DataModelInputViewModel.cs @@ -1,14 +1,10 @@ using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -using System.Threading.Tasks; -using System.Windows; -using System.Windows.Data; -using System.Windows.Input; using Artemis.Core.Modules; -using Stylet; +using ReactiveUI; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.DataModelVisualization { /// /// Represents a input view model @@ -37,7 +33,7 @@ namespace Artemis.UI.Shared public T InputValue { get => _inputValue; - set => SetAndNotify(ref _inputValue, value); + set => this.RaiseAndSetIfChanged(ref _inputValue, value); } /// @@ -54,9 +50,6 @@ namespace Artemis.UI.Shared return; _closed = true; - foreach (BindingExpressionBase sourceUpdatingBinding in BindingOperations.GetSourceUpdatingBindings(View)) - sourceUpdatingBinding.UpdateSource(); - OnSubmit(); UpdateCallback(InputValue, true); } @@ -76,7 +69,7 @@ namespace Artemis.UI.Shared /// /// For internal use only, implement instead. /// - public abstract class DataModelInputViewModel : PropertyChangedBase, IViewAware + public abstract class DataModelInputViewModel : ReactiveObject { /// /// Prevents this type being implemented directly, implement instead. @@ -117,24 +110,5 @@ namespace Artemis.UI.Shared protected virtual void OnCancel() { } - - /// - public void AttachView(UIElement view) - { - if (View != null) - throw new InvalidOperationException(string.Format("Tried to attach View {0} to ViewModel {1}, but it already has a view attached", view.GetType().Name, GetType().Name)); - - View = view; - - // After the animation finishes attempt to focus the input field - Task.Run(async () => - { - await Task.Delay(50); - await Execute.OnUIThreadAsync(() => View.MoveFocus(new TraversalRequest(FocusNavigationDirection.First))); - }); - } - - /// - public UIElement? View { get; set; } } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/DataModelVisualization/DataModelVisualizationRegistration.cs b/src/Artemis.UI.Shared/DataModelVisualization/DataModelVisualizationRegistration.cs index 310063ef0..e867a2995 100644 --- a/src/Artemis.UI.Shared/DataModelVisualization/DataModelVisualizationRegistration.cs +++ b/src/Artemis.UI.Shared/DataModelVisualization/DataModelVisualizationRegistration.cs @@ -2,8 +2,9 @@ using System.Collections.Generic; using Artemis.Core; using Artemis.UI.Shared.Services; +using Artemis.UI.Shared.Services.Interfaces; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.DataModelVisualization { /// /// Represents a layer brush registered through diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelEventViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelEventViewModel.cs index 55ccdf424..c6b3b1478 100644 --- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelEventViewModel.cs +++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelEventViewModel.cs @@ -3,8 +3,10 @@ using System.Linq; using Artemis.Core; using Artemis.Core.Modules; using Artemis.UI.Shared.Services; +using Artemis.UI.Shared.Services.Interfaces; +using ReactiveUI; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.DataModelVisualization.Shared { /// /// Represents a view model that visualizes an event data model property @@ -23,7 +25,7 @@ namespace Artemis.UI.Shared public Type? DisplayValueType { get => _displayValueType; - set => SetAndNotify(ref _displayValueType, value); + set => this.RaiseAndSetIfChanged(ref _displayValueType, value); } /// diff --git a/src/Avalonia/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListItemViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListItemViewModel.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListItemViewModel.cs rename to src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListItemViewModel.cs diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListPropertiesViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListPropertiesViewModel.cs deleted file mode 100644 index d9060f943..000000000 --- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListPropertiesViewModel.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Linq; -using Artemis.Core; -using Artemis.UI.Shared.Services; - -namespace Artemis.UI.Shared -{ - /// - /// Represents a view model that wraps a regular but contained in - /// a - /// - public class DataModelListPropertiesViewModel : DataModelPropertiesViewModel - { - private object? _displayValue; - private int _index; - private Type? _listType; - - internal DataModelListPropertiesViewModel(Type listType, string? name) : base(null, null, null) - { - ListType = listType; - } - - /// - /// Gets the index of the element within the list - /// - public int Index - { - get => _index; - set => SetAndNotify(ref _index, value); - } - - /// - /// Gets the type of elements contained in the list - /// - public Type? ListType - { - get => _listType; - set => SetAndNotify(ref _listType, value); - } - - /// - /// Gets the value of the property that is being visualized - /// - public new object? DisplayValue - { - get => _displayValue; - set => SetAndNotify(ref _displayValue, value); - } - - /// - /// Gets the view model that handles displaying the property - /// - public DataModelVisualizationViewModel? DisplayViewModel => Children.FirstOrDefault(); - - /// - public override string? DisplayPath => null; - - /// - public override void Update(IDataModelUIService dataModelUIService, DataModelUpdateConfiguration? configuration) - { - PopulateProperties(dataModelUIService, configuration); - if (DisplayViewModel == null) - return; - - if (IsVisualizationExpanded && !DisplayViewModel.IsVisualizationExpanded) - DisplayViewModel.IsVisualizationExpanded = IsVisualizationExpanded; - DisplayViewModel.Update(dataModelUIService, null); - } - - /// - public override object? GetCurrentValue() - { - return DisplayValue; - } - - /// - public override string ToString() - { - return $"[List item {Index}] {DisplayPath ?? Path}"; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListPropertyViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListPropertyViewModel.cs deleted file mode 100644 index 29bdeb259..000000000 --- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListPropertyViewModel.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using Artemis.Core; -using Artemis.UI.Shared.Services; - -namespace Artemis.UI.Shared -{ - /// - /// Represents a view model that visualizes a single data model property contained in a - /// - /// - public class DataModelListPropertyViewModel : DataModelPropertyViewModel - { - private int _index; - private Type? _listType; - - internal DataModelListPropertyViewModel(Type listType, DataModelDisplayViewModel displayViewModel, string? name) : base(null, null, null) - { - ListType = listType; - DisplayViewModel = displayViewModel; - } - - internal DataModelListPropertyViewModel(Type listType, string? name) : base(null, null, null) - { - ListType = listType; - } - - /// - /// Gets the index of the element within the list - /// - public int Index - { - get => _index; - internal set => SetAndNotify(ref _index, value); - } - - /// - /// Gets the type of elements contained in the list - /// - public Type? ListType - { - get => _listType; - private set => SetAndNotify(ref _listType, value); - } - - /// - public override object? GetCurrentValue() - { - return DisplayValue; - } - - /// - public override void Update(IDataModelUIService dataModelUIService, DataModelUpdateConfiguration? configuration) - { - // Display value gets updated by parent, don't do anything if it is null - if (DisplayValue == null) - return; - - if (DisplayViewModel == null) - DisplayViewModel = dataModelUIService.GetDataModelDisplayViewModel(DisplayValue.GetType(), PropertyDescription, true); - - ListType = DisplayValue.GetType(); - DisplayViewModel?.UpdateValue(DisplayValue); - } - - /// - public override string ToString() - { - return $"[List item {Index}] {DisplayPath ?? Path} - {DisplayValue}"; - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListViewModel.cs index 3605c43a0..9ec4838d9 100644 --- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListViewModel.cs +++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListViewModel.cs @@ -1,12 +1,13 @@ using System; using System.Collections; -using System.Windows.Documents; +using System.Collections.ObjectModel; using Artemis.Core; using Artemis.Core.Modules; using Artemis.UI.Shared.Services; -using Stylet; +using Artemis.UI.Shared.Services.Interfaces; +using ReactiveUI; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.DataModelVisualization.Shared { /// /// Represents a view model that visualizes a list data model property @@ -16,14 +17,14 @@ namespace Artemis.UI.Shared private string _countDisplay; private Type? _displayValueType; private IEnumerable? _list; - private BindableCollection _listChildren; + private ObservableCollection _listChildren; private int _listCount; internal DataModelListViewModel(DataModel dataModel, DataModelVisualizationViewModel parent, DataModelPath dataModelPath) : base(dataModel, parent, dataModelPath) { _countDisplay = "0 items"; - _listChildren = new BindableCollection(); + _listChildren = new ObservableCollection(); } /// @@ -32,7 +33,7 @@ namespace Artemis.UI.Shared public IEnumerable? List { get => _list; - private set => SetAndNotify(ref _list, value); + private set => this.RaiseAndSetIfChanged(ref _list, value); } /// @@ -41,7 +42,7 @@ namespace Artemis.UI.Shared public int ListCount { get => _listCount; - private set => SetAndNotify(ref _listCount, value); + private set => this.RaiseAndSetIfChanged(ref _listCount, value); } /// @@ -50,7 +51,7 @@ namespace Artemis.UI.Shared public Type? DisplayValueType { get => _displayValueType; - set => SetAndNotify(ref _displayValueType, value); + set => this.RaiseAndSetIfChanged(ref _displayValueType, value); } /// @@ -59,16 +60,16 @@ namespace Artemis.UI.Shared public string CountDisplay { get => _countDisplay; - set => SetAndNotify(ref _countDisplay, value); + set => this.RaiseAndSetIfChanged(ref _countDisplay, value); } /// /// Gets a list of child view models that visualize the elements in the list /// - public BindableCollection ListChildren + public ObservableCollection ListChildren { get => _listChildren; - private set => SetAndNotify(ref _listChildren, value); + private set => this.RaiseAndSetIfChanged(ref _listChildren, value); } /// @@ -97,22 +98,15 @@ namespace Artemis.UI.Shared ListChildren.Add(child); } else - { child = ListChildren[index]; - } - if (child is DataModelListPropertiesViewModel dataModelListClassViewModel) - { - dataModelListClassViewModel.DisplayValue = item; - dataModelListClassViewModel.Index = index; - } - else if (child is DataModelListPropertyViewModel dataModelListPropertyViewModel) + if (child is DataModelListItemViewModel dataModelListPropertyViewModel) { dataModelListPropertyViewModel.DisplayValue = item; dataModelListPropertyViewModel.Index = index; + dataModelListPropertyViewModel.Update(dataModelUIService, configuration); } - child.Update(dataModelUIService, configuration); index++; } @@ -134,16 +128,10 @@ namespace Artemis.UI.Shared { // If a display VM was found, prefer to use that in any case DataModelDisplayViewModel? typeViewModel = dataModelUIService.GetDataModelDisplayViewModel(listType, PropertyDescription); - if (typeViewModel != null) - return new DataModelListPropertyViewModel(listType, typeViewModel, name); - // For primitives, create a property view model, it may be null that is fine - if (listType.IsPrimitive || listType.IsEnum || listType == typeof(string)) - return new DataModelListPropertyViewModel(listType, name); - // For other value types create a child view model - if (listType.IsClass || listType.IsStruct()) - return new DataModelListPropertiesViewModel(listType, name); - return null; + return typeViewModel != null + ? new DataModelListItemViewModel(listType, typeViewModel, name) + : new DataModelListItemViewModel(listType, name); } } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertiesViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertiesViewModel.cs index 423af79e9..e162f0599 100644 --- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertiesViewModel.cs +++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertiesViewModel.cs @@ -2,8 +2,10 @@ using Artemis.Core; using Artemis.Core.Modules; using Artemis.UI.Shared.Services; +using Artemis.UI.Shared.Services.Interfaces; +using ReactiveUI; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.DataModelVisualization.Shared { /// /// Represents a view model that visualizes a class (POCO) data model property containing child properties @@ -24,7 +26,7 @@ namespace Artemis.UI.Shared public Type? DisplayValueType { get => _displayValueType; - private set => SetAndNotify(ref _displayValueType, value); + private set => this.RaiseAndSetIfChanged(ref _displayValueType, value); } /// @@ -33,7 +35,7 @@ namespace Artemis.UI.Shared public object? DisplayValue { get => _displayValue; - private set => SetAndNotify(ref _displayValue, value); + private set => this.RaiseAndSetIfChanged(ref _displayValue, value); } /// diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertyViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertyViewModel.cs index 5f4b35891..f6215d7af 100644 --- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertyViewModel.cs +++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelPropertyViewModel.cs @@ -2,8 +2,10 @@ using Artemis.Core; using Artemis.Core.Modules; using Artemis.UI.Shared.Services; +using Artemis.UI.Shared.Services.Interfaces; +using ReactiveUI; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.DataModelVisualization.Shared { /// /// Represents a view model that visualizes a single data model property contained in a @@ -26,7 +28,7 @@ namespace Artemis.UI.Shared public object? DisplayValue { get => _displayValue; - internal set => SetAndNotify(ref _displayValue, value); + internal set => this.RaiseAndSetIfChanged(ref _displayValue, value); } /// @@ -35,7 +37,7 @@ namespace Artemis.UI.Shared public Type? DisplayValueType { get => _displayValueType; - protected set => SetAndNotify(ref _displayValueType, value); + protected set => this.RaiseAndSetIfChanged(ref _displayValueType, value); } /// @@ -44,7 +46,7 @@ namespace Artemis.UI.Shared public DataModelDisplayViewModel? DisplayViewModel { get => _displayViewModel; - internal set => SetAndNotify(ref _displayViewModel, value); + internal set => this.RaiseAndSetIfChanged(ref _displayViewModel, value); } /// diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelUpdateConfiguration.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelUpdateConfiguration.cs index bd4747b1d..fe41f0644 100644 --- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelUpdateConfiguration.cs +++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelUpdateConfiguration.cs @@ -1,4 +1,4 @@ -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.DataModelVisualization.Shared { /// /// Represents a configuration to use while updating a diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelVisualizationViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelVisualizationViewModel.cs index 17432d696..9a212bae1 100644 --- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelVisualizationViewModel.cs +++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelVisualizationViewModel.cs @@ -6,368 +6,396 @@ using System.Reflection; using System.Text; using Artemis.Core; using Artemis.Core.Modules; -using Artemis.UI.Shared.Services; -using Stylet; +using Artemis.UI.Shared.Services.Interfaces; +using ReactiveUI; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.DataModelVisualization.Shared; + +/// +/// Represents a base class for a view model that visualizes a part of the data model +/// +public abstract class DataModelVisualizationViewModel : ReactiveObject, IDisposable { - /// - /// Represents a base class for a view model that visualizes a part of the data model - /// - public abstract class DataModelVisualizationViewModel : PropertyChangedBase, IDisposable + private const int MaxDepth = 4; + private ObservableCollection _children; + private DataModel? _dataModel; + private bool _isMatchingFilteredTypes; + private bool _isVisualizationExpanded; + private DataModelVisualizationViewModel? _parent; + private bool _populatedStaticChildren; + private DataModelPropertyAttribute? _propertyDescription; + + internal DataModelVisualizationViewModel(DataModel? dataModel, DataModelVisualizationViewModel? parent, DataModelPath? dataModelPath) { - private const int MaxDepth = 4; - private BindableCollection _children; - private DataModel? _dataModel; - private bool _isMatchingFilteredTypes; - private bool _isVisualizationExpanded; - private DataModelVisualizationViewModel? _parent; - private DataModelPropertyAttribute? _propertyDescription; - private bool _populatedStaticChildren; + _dataModel = dataModel; + _children = new ObservableCollection(); + _parent = parent; + DataModelPath = dataModelPath; + IsMatchingFilteredTypes = true; - internal DataModelVisualizationViewModel(DataModel? dataModel, DataModelVisualizationViewModel? parent, DataModelPath? dataModelPath) + if (parent == null) + IsRootViewModel = true; + else + PropertyDescription = DataModelPath?.GetPropertyDescription() ?? DataModel?.DataModelDescription; + } + + /// + /// Gets a boolean indicating whether this view model is at the root of the data model + /// + public bool IsRootViewModel { get; protected set; } + + /// + /// Gets the data model path to the property this view model is visualizing + /// + public DataModelPath? DataModelPath { get; } + + /// + /// Gets a string representation of the path backing this model + /// + public string? Path => DataModelPath?.Path; + + /// + /// Gets the property depth of the view model + /// + public int Depth { get; private set; } + + /// + /// Gets the data model backing this view model + /// + public DataModel? DataModel + { + get => _dataModel; + protected set => this.RaiseAndSetIfChanged(ref _dataModel, value); + } + + /// + /// Gets the property description of the property this view model is visualizing + /// + public DataModelPropertyAttribute? PropertyDescription + { + get => _propertyDescription; + protected set => this.RaiseAndSetIfChanged(ref _propertyDescription, value); + } + + /// + /// Gets the parent of this view model + /// + public DataModelVisualizationViewModel? Parent + { + get => _parent; + protected set => this.RaiseAndSetIfChanged(ref _parent, value); + } + + /// + /// Gets or sets an observable collection containing the children of this view model + /// + public ObservableCollection Children + { + get => _children; + set => this.RaiseAndSetIfChanged(ref _children, value); + } + + /// + /// Gets a boolean indicating whether the property being visualized matches the types last provided to + /// + /// + public bool IsMatchingFilteredTypes + { + get => _isMatchingFilteredTypes; + private set => this.RaiseAndSetIfChanged(ref _isMatchingFilteredTypes, value); + } + + /// + /// Gets or sets a boolean indicating whether the visualization is expanded, exposing the + /// + public bool IsVisualizationExpanded + { + get => _isVisualizationExpanded; + set { - _dataModel = dataModel; - _children = new BindableCollection(); - _parent = parent; - DataModelPath = dataModelPath; - IsMatchingFilteredTypes = true; - - if (parent == null) - IsRootViewModel = true; - else - PropertyDescription = DataModelPath?.GetPropertyDescription() ?? DataModel?.DataModelDescription; + if (!this.RaiseAndSetIfChanged(ref _isVisualizationExpanded, value)) return; + RequestUpdate(); } + } - /// - /// Gets a boolean indicating whether this view model is at the root of the data model - /// - public bool IsRootViewModel { get; protected set; } + /// + /// Gets a user-friendly representation of the + /// + public virtual string? DisplayPath => DataModelPath != null + ? string.Join(" › ", DataModelPath.Segments.Select(s => s.GetPropertyDescription()?.Name ?? s.Identifier)) + : null; - /// - /// Gets the data model path to the property this view model is visualizing - /// - public DataModelPath? DataModelPath { get; } - - /// - /// Gets a string representation of the path backing this model - /// - public string? Path => DataModelPath?.Path; - - /// - /// Gets the property depth of the view model - /// - public int Depth { get; private set; } - - /// - /// Gets the data model backing this view model - /// - public DataModel? DataModel - { - get => _dataModel; - protected set => SetAndNotify(ref _dataModel, value); - } - - /// - /// Gets the property description of the property this view model is visualizing - /// - public DataModelPropertyAttribute? PropertyDescription - { - get => _propertyDescription; - protected set => SetAndNotify(ref _propertyDescription, value); - } - - /// - /// Gets the parent of this view model - /// - public DataModelVisualizationViewModel? Parent - { - get => _parent; - protected set => SetAndNotify(ref _parent, value); - } - - /// - /// Gets or sets a bindable collection containing the children of this view model - /// - public BindableCollection Children - { - get => _children; - set => SetAndNotify(ref _children, value); - } - - /// - /// Gets a boolean indicating whether the property being visualized matches the types last provided to - /// - /// - public bool IsMatchingFilteredTypes - { - get => _isMatchingFilteredTypes; - private set => SetAndNotify(ref _isMatchingFilteredTypes, value); - } - - /// - /// Gets or sets a boolean indicating whether the visualization is expanded, exposing the - /// - public bool IsVisualizationExpanded - { - get => _isVisualizationExpanded; - set - { - if (!SetAndNotify(ref _isVisualizationExpanded, value)) return; - RequestUpdate(); - } - } - - /// - /// Gets a user-friendly representation of the - /// - public virtual string? DisplayPath => DataModelPath != null - ? string.Join(" › ", DataModelPath.Segments.Select(s => s.GetPropertyDescription()?.Name ?? s.Identifier)) - : null; - - /// - /// Updates the datamodel and if in an parent, any children - /// - /// The data model UI service used during update - /// The configuration to apply while updating - public abstract void Update(IDataModelUIService dataModelUIService, DataModelUpdateConfiguration? configuration); - - /// - /// Gets the current value of the property being visualized - /// - /// The current value of the property being visualized - public virtual object? GetCurrentValue() - { - if (IsRootViewModel) - return null; - - return DataModelPath?.GetValue(); - } - - /// - /// Determines whether the provided types match the type of the property being visualized and sets the result in - /// - /// - /// Whether the type may be a loose match, meaning it can be cast or converted - /// The types to filter - public void ApplyTypeFilter(bool looseMatch, params Type[]? filteredTypes) - { - if (filteredTypes != null) - { - if (filteredTypes.All(t => t == null)) - filteredTypes = null; - else - filteredTypes = filteredTypes.Where(t => t != null).ToArray(); - } - - // If the VM has children, its own type is not relevant - if (Children.Any()) - { - foreach (DataModelVisualizationViewModel child in Children) - child?.ApplyTypeFilter(looseMatch, filteredTypes); - - IsMatchingFilteredTypes = true; - return; - } - - // If null is passed, clear the type filter - if (filteredTypes == null || filteredTypes.Length == 0) - { - IsMatchingFilteredTypes = true; - return; - } - - // If the type couldn't be retrieved either way, assume false - Type? type = DataModelPath?.GetPropertyType(); - if (type == null) - { - IsMatchingFilteredTypes = false; - return; - } - - if (looseMatch) - IsMatchingFilteredTypes = filteredTypes.Any(t => t.IsCastableFrom(type) || - t == typeof(Enum) && type.IsEnum || - t == typeof(IEnumerable<>) && type.IsGenericEnumerable() || - type.IsGenericType && t == type.GetGenericTypeDefinition()); - else - IsMatchingFilteredTypes = filteredTypes.Any(t => t == type || t == typeof(Enum) && type.IsEnum); - } - - internal virtual int GetChildDepth() - { - return 0; - } - - internal void PopulateProperties(IDataModelUIService dataModelUIService, DataModelUpdateConfiguration? dataModelUpdateConfiguration) - { - if (IsRootViewModel && DataModel == null) - return; - - Type? modelType = IsRootViewModel ? DataModel?.GetType() : DataModelPath?.GetPropertyType(); - if (modelType == null) - throw new ArtemisSharedUIException("Failed to populate data model visualization properties, couldn't get a property type"); - - // Add missing static children only once, they're static after all - if (!_populatedStaticChildren) - { - foreach (PropertyInfo propertyInfo in modelType.GetProperties(BindingFlags.Public | BindingFlags.Instance).OrderBy(t => t.MetadataToken)) - { - string childPath = AppendToPath(propertyInfo.Name); - if (Children.Any(c => c.Path != null && c.Path.Equals(childPath))) - continue; - if (propertyInfo.GetCustomAttribute() != null) - continue; - MethodInfo? getMethod = propertyInfo.GetGetMethod(); - if (getMethod == null || getMethod.GetParameters().Any()) - continue; - - DataModelVisualizationViewModel? child = CreateChild(dataModelUIService, childPath, GetChildDepth()); - if (child != null) - Children.Add(child); - } - - _populatedStaticChildren = true; - } - - // Remove static children that should be hidden - if (DataModel != null) - { - ReadOnlyCollection hiddenProperties = DataModel.GetHiddenProperties(); - foreach (PropertyInfo hiddenProperty in hiddenProperties) - { - string childPath = AppendToPath(hiddenProperty.Name); - DataModelVisualizationViewModel? toRemove = Children.FirstOrDefault(c => c.Path != null && c.Path == childPath); - if (toRemove != null) - Children.Remove(toRemove); - } - } - - // Add missing dynamic children - object? value = Parent == null || Parent.IsRootViewModel ? DataModel : DataModelPath?.GetValue(); - if (value is DataModel dataModel) - { - foreach (string key in dataModel.DynamicChildren.Keys.ToList()) - { - string childPath = AppendToPath(key); - if (Children.Any(c => c.Path != null && c.Path.Equals(childPath))) - continue; - - DataModelVisualizationViewModel? child = CreateChild(dataModelUIService, childPath, GetChildDepth()); - if (child != null) - Children.Add(child); - } - } - - // Remove dynamic children that have been removed from the data model - List toRemoveDynamic = Children.Where(c => c.DataModelPath != null && !c.DataModelPath.IsValid).ToList(); - if (toRemoveDynamic.Any()) - Children.RemoveRange(toRemoveDynamic); - } - - private DataModelVisualizationViewModel? CreateChild(IDataModelUIService dataModelUIService, string path, int depth) - { - if (DataModel == null) - throw new ArtemisSharedUIException("Cannot create a data model visualization child VM for a parent without a data model"); - if (depth > MaxDepth) - return null; - - DataModelPath dataModelPath = new(DataModel, path); - if (!dataModelPath.IsValid) - return null; - - PropertyInfo? propertyInfo = dataModelPath.GetPropertyInfo(); - Type? propertyType = dataModelPath.GetPropertyType(); - - // Skip properties decorated with DataModelIgnore - if (propertyInfo != null && Attribute.IsDefined(propertyInfo, typeof(DataModelIgnoreAttribute))) - return null; - // Skip properties that are in the ignored properties list of the respective profile module/data model expansion - if (DataModel.GetHiddenProperties().Any(p => p.Equals(propertyInfo))) - return null; - - if (propertyType == null) - return null; - - // If a display VM was found, prefer to use that in any case - DataModelDisplayViewModel? typeViewModel = dataModelUIService.GetDataModelDisplayViewModel(propertyType, PropertyDescription); - if (typeViewModel != null) - return new DataModelPropertyViewModel(DataModel, this, dataModelPath) {DisplayViewModel = typeViewModel, Depth = depth}; - // For primitives, create a property view model, it may be null that is fine - if (propertyType.IsPrimitive || propertyType.IsEnum || propertyType == typeof(string) || propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) - return new DataModelPropertyViewModel(DataModel, this, dataModelPath) {Depth = depth}; - if (propertyType.IsGenericEnumerable()) - return new DataModelListViewModel(DataModel, this, dataModelPath) {Depth = depth}; - if (propertyType == typeof(DataModelEvent) || propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(DataModelEvent<>)) - return new DataModelEventViewModel(DataModel, this, dataModelPath) {Depth = depth}; - // For other value types create a child view model - if (propertyType.IsClass || propertyType.IsStruct()) - return new DataModelPropertiesViewModel(DataModel, this, dataModelPath) {Depth = depth}; + /// + /// Updates the datamodel and if in an parent, any children + /// + /// The data model UI service used during update + /// The configuration to apply while updating + public abstract void Update(IDataModelUIService dataModelUIService, DataModelUpdateConfiguration? configuration); + /// + /// Gets the current value of the property being visualized + /// + /// The current value of the property being visualized + public virtual object? GetCurrentValue() + { + if (IsRootViewModel) return null; + + return DataModelPath?.GetValue(); + } + + /// + /// Determines whether the provided types match the type of the property being visualized and sets the result in + /// + /// + /// Whether the type may be a loose match, meaning it can be cast or converted + /// The types to filter + public void ApplyTypeFilter(bool looseMatch, params Type[]? filteredTypes) + { + if (filteredTypes != null) + { + if (filteredTypes.All(t => t == null)) + filteredTypes = null; + else + filteredTypes = filteredTypes.Where(t => t != null).ToArray(); } - private string AppendToPath(string toAppend) + // If the VM has children, its own type is not relevant + if (Children.Any()) { - if (string.IsNullOrEmpty(Path)) - return toAppend; + foreach (DataModelVisualizationViewModel child in Children) + child?.ApplyTypeFilter(looseMatch, filteredTypes); - StringBuilder builder = new(); - builder.Append(Path); - builder.Append("."); - builder.Append(toAppend); - return builder.ToString(); + IsMatchingFilteredTypes = true; + return; } - private void RequestUpdate() + // If null is passed, clear the type filter + if (filteredTypes == null || filteredTypes.Length == 0) { - Parent?.RequestUpdate(); - OnUpdateRequested(); + IsMatchingFilteredTypes = true; + return; } - #region Events - - /// - /// Occurs when an update to the property this view model visualizes is requested - /// - public event EventHandler? UpdateRequested; - - /// - /// Invokes the event - /// - protected virtual void OnUpdateRequested() + // If the type couldn't be retrieved either way, assume false + Type? type = DataModelPath?.GetPropertyType(); + if (type == null) { - UpdateRequested?.Invoke(this, EventArgs.Empty); + IsMatchingFilteredTypes = false; + return; } - #endregion + if (looseMatch) + IsMatchingFilteredTypes = filteredTypes.Any(t => t.IsCastableFrom(type) || + t == typeof(Enum) && type.IsEnum || + t == typeof(IEnumerable<>) && type.IsGenericEnumerable() || + type.IsGenericType && t == type.GetGenericTypeDefinition()); + else + IsMatchingFilteredTypes = filteredTypes.Any(t => t == type || t == typeof(Enum) && type.IsEnum); + } - #region IDisposable + /// + /// Occurs when an update to the property this view model visualizes is requested + /// + public event EventHandler? UpdateRequested; - /// - /// Releases the unmanaged resources used by the object and optionally releases the managed resources. - /// - /// - /// to release both managed and unmanaged resources; - /// to release only unmanaged resources. - /// - protected virtual void Dispose(bool disposing) + /// + /// Expands this view model and any children to expose the provided . + /// + /// The data model path to expose. + public void ExpandToPath(DataModelPath dataModelPath) + { + if (dataModelPath.Target != DataModel) + throw new ArtemisSharedUIException("Can't expand to a path that doesn't belong to this data model."); + + IsVisualizationExpanded = true; + DataModelPathSegment current = dataModelPath.Segments.Skip(1).First(); + Children.FirstOrDefault(c => c.Path == current.Path)?.ExpandToPath(current.Next); + } + + /// + /// Finds the view model that hosts the given path. + /// + /// The path to find + /// The matching view model, may be null if the path doesn't exist or isn't expanded + public DataModelVisualizationViewModel? GetViewModelForPath(DataModelPath dataModelPath) + { + if (dataModelPath.Target != DataModel) + throw new ArtemisSharedUIException("Can't expand to a path that doesn't belong to this data model."); + + if (DataModelPath?.Path == dataModelPath.Path) + return this; + + return Children.Select(c => c.GetViewModelForPath(dataModelPath)).FirstOrDefault(match => match != null); + } + + /// + /// Invokes the event + /// + protected virtual void OnUpdateRequested() + { + UpdateRequested?.Invoke(this, EventArgs.Empty); + } + + /// + /// Releases the unmanaged resources used by the object and optionally releases the managed resources. + /// + /// + /// to release both managed and unmanaged resources; + /// to release only unmanaged resources. + /// + protected virtual void Dispose(bool disposing) + { + if (disposing) { - if (disposing) + DataModelPath?.Dispose(); + foreach (DataModelVisualizationViewModel dataModelVisualizationViewModel in Children) + dataModelVisualizationViewModel.Dispose(true); + } + } + + internal virtual int GetChildDepth() + { + return 0; + } + + internal void PopulateProperties(IDataModelUIService dataModelUIService, DataModelUpdateConfiguration? dataModelUpdateConfiguration) + { + if (IsRootViewModel && DataModel == null) + return; + + Type? modelType = IsRootViewModel ? DataModel?.GetType() : DataModelPath?.GetPropertyType(); + if (modelType == null) + throw new ArtemisSharedUIException("Failed to populate data model visualization properties, couldn't get a property type"); + + // Add missing static children only once, they're static after all + if (!_populatedStaticChildren) + { + foreach (PropertyInfo propertyInfo in modelType.GetProperties(BindingFlags.Public | BindingFlags.Instance).OrderBy(t => t.MetadataToken)) { - DataModelPath?.Dispose(); - foreach (DataModelVisualizationViewModel dataModelVisualizationViewModel in Children) - dataModelVisualizationViewModel.Dispose(true); + string childPath = AppendToPath(propertyInfo.Name); + if (Children.Any(c => c?.Path != null && c.Path.Equals(childPath))) + continue; + if (propertyInfo.GetCustomAttribute() != null) + continue; + MethodInfo? getMethod = propertyInfo.GetGetMethod(); + if (getMethod == null || getMethod.GetParameters().Any()) + continue; + + DataModelVisualizationViewModel? child = CreateChild(dataModelUIService, childPath, GetChildDepth()); + if (child != null) + Children.Add(child); + } + + _populatedStaticChildren = true; + } + + // Remove static children that should be hidden + if (DataModel != null) + { + ReadOnlyCollection hiddenProperties = DataModel.GetHiddenProperties(); + foreach (PropertyInfo hiddenProperty in hiddenProperties) + { + string childPath = AppendToPath(hiddenProperty.Name); + DataModelVisualizationViewModel? toRemove = Children.FirstOrDefault(c => c.Path != null && c.Path == childPath); + if (toRemove != null) + Children.Remove(toRemove); } } - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } + // Add missing dynamic children + object? value = Parent == null || Parent.IsRootViewModel ? DataModel : DataModelPath?.GetValue(); + if (value is DataModel dataModel) + foreach (string key in dataModel.DynamicChildren.Keys.ToList()) + { + string childPath = AppendToPath(key); + if (Children.Any(c => c.Path != null && c.Path.Equals(childPath))) + continue; - #endregion + DataModelVisualizationViewModel? child = CreateChild(dataModelUIService, childPath, GetChildDepth()); + if (child != null) + Children.Add(child); + } + + // Remove dynamic children that have been removed from the data model + List toRemoveDynamic = Children.Where(c => c.DataModelPath != null && !c.DataModelPath.IsValid).ToList(); + foreach (DataModelVisualizationViewModel dataModelVisualizationViewModel in toRemoveDynamic) + Children.Remove(dataModelVisualizationViewModel); + } + + private DataModelVisualizationViewModel? CreateChild(IDataModelUIService dataModelUIService, string path, int depth) + { + if (DataModel == null) + throw new ArtemisSharedUIException("Cannot create a data model visualization child VM for a parent without a data model"); + if (depth > MaxDepth) + return null; + + DataModelPath dataModelPath = new(DataModel, path); + if (!dataModelPath.IsValid) + return null; + + PropertyInfo? propertyInfo = dataModelPath.GetPropertyInfo(); + Type? propertyType = dataModelPath.GetPropertyType(); + + // Skip properties decorated with DataModelIgnore + if (propertyInfo != null && Attribute.IsDefined(propertyInfo, typeof(DataModelIgnoreAttribute))) + return null; + // Skip properties that are in the ignored properties list of the respective profile module/data model expansion + if (DataModel.GetHiddenProperties().Any(p => p.Equals(propertyInfo))) + return null; + + if (propertyType == null) + return null; + + // If a display VM was found, prefer to use that in any case + DataModelDisplayViewModel? typeViewModel = dataModelUIService.GetDataModelDisplayViewModel(propertyType, PropertyDescription); + if (typeViewModel != null) + return new DataModelPropertyViewModel(DataModel, this, dataModelPath) {DisplayViewModel = typeViewModel, Depth = depth}; + // For primitives, create a property view model, it may be null that is fine + if (propertyType.IsPrimitive || propertyType.IsEnum || propertyType == typeof(string) || propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) + return new DataModelPropertyViewModel(DataModel, this, dataModelPath) {Depth = depth}; + if (propertyType.IsGenericEnumerable()) + return new DataModelListViewModel(DataModel, this, dataModelPath) {Depth = depth}; + if (propertyType == typeof(DataModelEvent) || propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(DataModelEvent<>)) + return new DataModelEventViewModel(DataModel, this, dataModelPath) {Depth = depth}; + // For other value types create a child view model + if (propertyType.IsClass || propertyType.IsStruct()) + return new DataModelPropertiesViewModel(DataModel, this, dataModelPath) {Depth = depth}; + + return null; + } + + private string AppendToPath(string toAppend) + { + if (string.IsNullOrEmpty(Path)) + return toAppend; + + StringBuilder builder = new(); + builder.Append(Path); + builder.Append("."); + builder.Append(toAppend); + return builder.ToString(); + } + + private void RequestUpdate() + { + Parent?.RequestUpdate(); + OnUpdateRequested(); + } + + private void ExpandToPath(DataModelPathSegment? segment) + { + if (segment == null) + return; + + IsVisualizationExpanded = true; + Children.FirstOrDefault(c => c.Path == segment.Path)?.ExpandToPath(segment.Next); + } + + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); } } \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.axaml b/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.axaml similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.axaml rename to src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.axaml diff --git a/src/Avalonia/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.axaml.cs b/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.axaml.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.axaml.cs rename to src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayView.axaml.cs diff --git a/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayViewModel.cs b/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayViewModel.cs index cced51797..40a265190 100644 --- a/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayViewModel.cs +++ b/src/Artemis.UI.Shared/DefaultTypes/DataModel/Display/DefaultDataModelDisplayViewModel.cs @@ -1,4 +1,8 @@ using System; +using Artemis.Core; +using Artemis.UI.Shared.DataModelVisualization; +using Newtonsoft.Json; +using ReactiveUI; namespace Artemis.UI.Shared.DefaultTypes.DataModel.Display { @@ -8,33 +12,33 @@ namespace Artemis.UI.Shared.DefaultTypes.DataModel.Display /// internal class DefaultDataModelDisplayViewModel : DataModelDisplayViewModel { - private bool _showNull; - private bool _showToString; + private readonly JsonSerializerSettings _serializerSettings; + private string _display; - internal DefaultDataModelDisplayViewModel() + public DefaultDataModelDisplayViewModel() { - ShowNull = true; + _serializerSettings = new JsonSerializerSettings() + { + ReferenceLoopHandling = ReferenceLoopHandling.Ignore, + PreserveReferencesHandling = PreserveReferencesHandling.None + }; + _display = "null"; } - public bool ShowToString + public string Display { - get => _showToString; - private set => SetAndNotify(ref _showToString, value); + get => _display; + set => RaiseAndSetIfChanged(ref _display, value); } - - public bool ShowNull - { - get => _showNull; - set => SetAndNotify(ref _showNull, value); - } - + protected override void OnDisplayValueUpdated() { if (DisplayValue is Enum enumDisplayValue) - DisplayValue = EnumUtilities.HumanizeValue(enumDisplayValue); - - ShowToString = DisplayValue != null; - ShowNull = DisplayValue == null; + Display = EnumUtilities.HumanizeValue(enumDisplayValue); + else if (DisplayValue is not string) + Display = JsonConvert.SerializeObject(DisplayValue, _serializerSettings); + else + Display = DisplayValue?.ToString() ?? "null"; } } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/DependencyProperties/SizeObserver.cs b/src/Artemis.UI.Shared/DependencyProperties/SizeObserver.cs deleted file mode 100644 index 9f085f67b..000000000 --- a/src/Artemis.UI.Shared/DependencyProperties/SizeObserver.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System.Windows; - -namespace Artemis.UI.Shared -{ - /// - /// Provides a dependency property that can observe the size of an element and apply it to bindings - /// - public static class SizeObserver - { - /// - /// Gets or sets whether the element should be observed - /// - public static readonly DependencyProperty ObserveProperty = DependencyProperty.RegisterAttached( - "Observe", - typeof(bool), - typeof(SizeObserver), - new FrameworkPropertyMetadata(OnObserveChanged)); - - /// - /// Gets or sets the observed width of the element - /// - public static readonly DependencyProperty ObservedWidthProperty = DependencyProperty.RegisterAttached( - "ObservedWidth", - typeof(double), - typeof(SizeObserver)); - - /// - /// Gets or sets the observed height of the element - /// - public static readonly DependencyProperty ObservedHeightProperty = DependencyProperty.RegisterAttached( - "ObservedHeight", - typeof(double), - typeof(SizeObserver)); - - /// - /// Gets whether the provided is being observed - /// - public static bool GetObserve(FrameworkElement frameworkElement) - { - return (bool) frameworkElement.GetValue(ObserveProperty); - } - - /// - /// Sets whether the provided is being observed - /// - public static void SetObserve(FrameworkElement frameworkElement, bool observe) - { - frameworkElement.SetValue(ObserveProperty, observe); - } - - /// - /// Gets the observed width of the the provided - /// - public static double GetObservedWidth(FrameworkElement frameworkElement) - { - return (double) frameworkElement.GetValue(ObservedWidthProperty); - } - - /// - /// Sets the observed width of the the provided - /// - public static void SetObservedWidth(FrameworkElement frameworkElement, double observedWidth) - { - frameworkElement.SetValue(ObservedWidthProperty, observedWidth); - } - - /// - /// Gets the observed height of the the provided - /// - public static double GetObservedHeight(FrameworkElement frameworkElement) - { - return (double) frameworkElement.GetValue(ObservedHeightProperty); - } - - /// - /// Sets the observed height of the the provided - /// - public static void SetObservedHeight(FrameworkElement frameworkElement, double observedHeight) - { - frameworkElement.SetValue(ObservedHeightProperty, observedHeight); - } - - private static void OnObserveChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) - { - FrameworkElement frameworkElement = (FrameworkElement) dependencyObject; - - if ((bool) e.NewValue) - { - frameworkElement.SizeChanged += OnFrameworkElementSizeChanged; - UpdateObservedSizesForFrameworkElement(frameworkElement); - } - else - { - frameworkElement.SizeChanged -= OnFrameworkElementSizeChanged; - } - } - - private static void OnFrameworkElementSizeChanged(object sender, SizeChangedEventArgs e) - { - UpdateObservedSizesForFrameworkElement((FrameworkElement) sender); - } - - private static void UpdateObservedSizesForFrameworkElement(FrameworkElement frameworkElement) - { - frameworkElement.SetCurrentValue(ObservedWidthProperty, frameworkElement.ActualWidth); - frameworkElement.SetCurrentValue(ObservedHeightProperty, frameworkElement.ActualHeight); - } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Events/DataModelSelectedEventArgs.cs b/src/Artemis.UI.Shared/Events/DataModelSelectedEventArgs.cs index 9306237ed..7f59aedad 100644 --- a/src/Artemis.UI.Shared/Events/DataModelSelectedEventArgs.cs +++ b/src/Artemis.UI.Shared/Events/DataModelSelectedEventArgs.cs @@ -2,7 +2,7 @@ using Artemis.Core; using Artemis.UI.Shared.Controls; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Events { /// /// Provides data about selection events raised by diff --git a/src/Avalonia/Artemis.UI.Shared/Events/DialogClosedEventArgs.cs b/src/Artemis.UI.Shared/Events/DialogClosedEventArgs.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Events/DialogClosedEventArgs.cs rename to src/Artemis.UI.Shared/Events/DialogClosedEventArgs.cs diff --git a/src/Artemis.UI.Shared/Events/LedClickedEventArgs.cs b/src/Artemis.UI.Shared/Events/LedClickedEventArgs.cs index 3455b9800..cfaa9a160 100644 --- a/src/Artemis.UI.Shared/Events/LedClickedEventArgs.cs +++ b/src/Artemis.UI.Shared/Events/LedClickedEventArgs.cs @@ -1,7 +1,7 @@ using System; using Artemis.Core; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Events { /// /// Provides data on LED click events raised by the device visualizer diff --git a/src/Artemis.UI.Shared/Events/ProfileConfigurationEventArgs.cs b/src/Artemis.UI.Shared/Events/ProfileConfigurationEventArgs.cs index 3ec9ac748..fc79d770b 100644 --- a/src/Artemis.UI.Shared/Events/ProfileConfigurationEventArgs.cs +++ b/src/Artemis.UI.Shared/Events/ProfileConfigurationEventArgs.cs @@ -1,7 +1,7 @@ using System; using Artemis.Core; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Events { /// /// Provides data on profile related events raised by the profile editor diff --git a/src/Artemis.UI.Shared/Events/RenderProfileElementEventArgs.cs b/src/Artemis.UI.Shared/Events/RenderProfileElementEventArgs.cs index e2555f3ab..67cd4d5ba 100644 --- a/src/Artemis.UI.Shared/Events/RenderProfileElementEventArgs.cs +++ b/src/Artemis.UI.Shared/Events/RenderProfileElementEventArgs.cs @@ -1,7 +1,7 @@ using System; using Artemis.Core; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Events { /// /// Provides data on profile element related events raised by the profile editor diff --git a/src/Avalonia/Artemis.UI.Shared/Events/SelectionRectangleEventArgs.cs b/src/Artemis.UI.Shared/Events/SelectionRectangleEventArgs.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Events/SelectionRectangleEventArgs.cs rename to src/Artemis.UI.Shared/Events/SelectionRectangleEventArgs.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Extensions/ControlExtensions.cs b/src/Artemis.UI.Shared/Extensions/ControlExtensions.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Extensions/ControlExtensions.cs rename to src/Artemis.UI.Shared/Extensions/ControlExtensions.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Extensions/LayerExtensions.cs b/src/Artemis.UI.Shared/Extensions/LayerExtensions.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Extensions/LayerExtensions.cs rename to src/Artemis.UI.Shared/Extensions/LayerExtensions.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Extensions/PointExtensions.cs b/src/Artemis.UI.Shared/Extensions/PointExtensions.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Extensions/PointExtensions.cs rename to src/Artemis.UI.Shared/Extensions/PointExtensions.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Extensions/SKColorExtensions.cs b/src/Artemis.UI.Shared/Extensions/SKColorExtensions.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Extensions/SKColorExtensions.cs rename to src/Artemis.UI.Shared/Extensions/SKColorExtensions.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Extensions/SKMatrixExtensions.cs b/src/Artemis.UI.Shared/Extensions/SKMatrixExtensions.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Extensions/SKMatrixExtensions.cs rename to src/Artemis.UI.Shared/Extensions/SKMatrixExtensions.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Extensions/SKRectExtensions.cs b/src/Artemis.UI.Shared/Extensions/SKRectExtensions.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Extensions/SKRectExtensions.cs rename to src/Artemis.UI.Shared/Extensions/SKRectExtensions.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Extensions/TypeExtensions.cs b/src/Artemis.UI.Shared/Extensions/TypeExtensions.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Extensions/TypeExtensions.cs rename to src/Artemis.UI.Shared/Extensions/TypeExtensions.cs diff --git a/src/Avalonia/Artemis.UI.Shared/Extensions/VisualExtensions.cs b/src/Artemis.UI.Shared/Extensions/VisualExtensions.cs similarity index 100% rename from src/Avalonia/Artemis.UI.Shared/Extensions/VisualExtensions.cs rename to src/Artemis.UI.Shared/Extensions/VisualExtensions.cs diff --git a/src/Artemis.UI.Shared/Ninject/Factories/ISharedVMFactory.cs b/src/Artemis.UI.Shared/Ninject/Factories/ISharedVMFactory.cs deleted file mode 100644 index 228b34c6e..000000000 --- a/src/Artemis.UI.Shared/Ninject/Factories/ISharedVMFactory.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Artemis.UI.Shared -{ - /// - /// Represents a factory for view models provided by the Artemis Shared UI library - /// - public interface ISharedVmFactory - { - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Ninject/SharedUIModule.cs b/src/Artemis.UI.Shared/Ninject/SharedUIModule.cs index 328e6fe06..b3469aa43 100644 --- a/src/Artemis.UI.Shared/Ninject/SharedUIModule.cs +++ b/src/Artemis.UI.Shared/Ninject/SharedUIModule.cs @@ -1,10 +1,9 @@ using System; -using Artemis.UI.Shared.Services; -using MaterialDesignThemes.Wpf; +using Artemis.UI.Shared.Services.Interfaces; using Ninject.Extensions.Conventions; using Ninject.Modules; -namespace Artemis.UI.Shared +namespace Artemis.UI.Shared.Ninject { /// /// The main of the Artemis Shared UI toolkit that binds all services @@ -27,17 +26,6 @@ namespace Artemis.UI.Shared .BindAllInterfaces() .Configure(c => c.InSingletonScope()); }); - - Kernel.Bind().ToConstant(new SnackbarMessageQueue(TimeSpan.FromSeconds(5))).InSingletonScope(); - - // Bind UI factories - Kernel.Bind(x => - { - x.FromThisAssembly() - .SelectAllInterfaces() - .InheritedFrom() - .BindToFactory(); - }); } } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Plugins/LayerBrushes/BrushConfigurationViewModel.cs b/src/Artemis.UI.Shared/Plugins/LayerBrushes/BrushConfigurationViewModel.cs index 0c61885b0..73f045f94 100644 --- a/src/Artemis.UI.Shared/Plugins/LayerBrushes/BrushConfigurationViewModel.cs +++ b/src/Artemis.UI.Shared/Plugins/LayerBrushes/BrushConfigurationViewModel.cs @@ -1,12 +1,13 @@ -using Artemis.Core.LayerBrushes; -using Stylet; +using System; +using System.Threading.Tasks; +using Artemis.Core.LayerBrushes; namespace Artemis.UI.Shared.LayerBrushes { /// /// Represents a view model for a brush configuration window /// - public abstract class BrushConfigurationViewModel : Screen + public abstract class BrushConfigurationViewModel : ActivatableViewModelBase { /// /// Creates a new instance of the class @@ -17,19 +18,40 @@ namespace Artemis.UI.Shared.LayerBrushes LayerBrush = layerBrush; } - /// - /// Creates a new instance of the class with a validator - /// - /// - /// - protected BrushConfigurationViewModel(BaseLayerBrush layerBrush, IModelValidator validator) : base(validator) - { - LayerBrush = layerBrush; - } - /// /// Gets the layer brush this view model is associated with /// public BaseLayerBrush LayerBrush { get; } + + /// + /// Closes the dialog + /// + public void RequestClose() + { + CloseRequested?.Invoke(this, EventArgs.Empty); + } + + /// + /// Called when the window wants to close, returning will cause the window to stay open. + /// + /// if the window may close; otherwise . + public virtual bool CanClose() + { + return true; + } + + /// + /// Called when the window wants to close, returning will cause the window to stay open. + /// + /// A task if the window may close; otherwise . + public virtual Task CanCloseAsync() + { + return Task.FromResult(true); + } + + /// + /// Occurs when a close was requested + /// + public event EventHandler? CloseRequested; } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Plugins/LayerBrushes/LayerBrushConfigurationDialog.cs b/src/Artemis.UI.Shared/Plugins/LayerBrushes/LayerBrushConfigurationDialog.cs index daf80ed91..7f7b94fa8 100644 --- a/src/Artemis.UI.Shared/Plugins/LayerBrushes/LayerBrushConfigurationDialog.cs +++ b/src/Artemis.UI.Shared/Plugins/LayerBrushes/LayerBrushConfigurationDialog.cs @@ -38,7 +38,7 @@ namespace Artemis.UI.Shared.LayerBrushes public int DialogHeight { get; set; } = 800; /// - /// The type of view model the tab contains + /// The type of view model the dialog contains /// public abstract Type Type { get; } } diff --git a/src/Artemis.UI.Shared/Plugins/LayerEffects/EffectConfigurationViewModel.cs b/src/Artemis.UI.Shared/Plugins/LayerEffects/EffectConfigurationViewModel.cs index aac795039..2645faddc 100644 --- a/src/Artemis.UI.Shared/Plugins/LayerEffects/EffectConfigurationViewModel.cs +++ b/src/Artemis.UI.Shared/Plugins/LayerEffects/EffectConfigurationViewModel.cs @@ -1,35 +1,57 @@ -using Artemis.Core.LayerEffects; -using Stylet; +using System; +using System.Threading.Tasks; +using Artemis.Core.LayerEffects; +using Avalonia.Threading; -namespace Artemis.UI.Shared.LayerEffects +namespace Artemis.UI.Shared.LayerEffects; + +/// +/// Represents a view model for an effect configuration window +/// +public abstract class EffectConfigurationViewModel : ActivatableViewModelBase { /// - /// Represents a view model for an effect configuration window + /// Creates a new instance of the class /// - public abstract class EffectConfigurationViewModel : Screen + /// + protected EffectConfigurationViewModel(BaseLayerEffect layerEffect) { - /// - /// Creates a new instance of the class - /// - /// - protected EffectConfigurationViewModel(BaseLayerEffect layerEffect) - { - LayerEffect = layerEffect; - } - - /// - /// Creates a new instance of the class with a validator - /// - /// - /// - protected EffectConfigurationViewModel(BaseLayerEffect layerEffect, IModelValidator validator) : base(validator) - { - LayerEffect = layerEffect; - } - - /// - /// Gets the layer effect this view model is associated with - /// - public BaseLayerEffect LayerEffect { get; } + LayerEffect = layerEffect; } + + /// + /// Gets the layer effect this view model is associated with + /// + public BaseLayerEffect LayerEffect { get; } + + /// + /// Closes the dialog + /// + public void RequestClose() + { + CloseRequested?.Invoke(this, EventArgs.Empty); + } + + /// + /// Called when the window wants to close, returning will cause the window to stay open. + /// + /// if the window may close; otherwise . + public virtual bool CanClose() + { + return true; + } + + /// + /// Called when the window wants to close, returning will cause the window to stay open. + /// + /// A task if the window may close; otherwise . + public virtual Task CanCloseAsync() + { + return Task.FromResult(true); + } + + /// + /// Occurs when a close was requested + /// + public event EventHandler? CloseRequested; } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Plugins/LayerEffects/LayerEffectConfigurationDialog.cs b/src/Artemis.UI.Shared/Plugins/LayerEffects/LayerEffectConfigurationDialog.cs index bb043fa93..f5810e74c 100644 --- a/src/Artemis.UI.Shared/Plugins/LayerEffects/LayerEffectConfigurationDialog.cs +++ b/src/Artemis.UI.Shared/Plugins/LayerEffects/LayerEffectConfigurationDialog.cs @@ -39,7 +39,7 @@ namespace Artemis.UI.Shared.LayerEffects public int DialogHeight { get; set; } = 800; /// - /// The type of view model the tab contains + /// The type of view model the dialog contains /// public abstract Type Type { get; } } diff --git a/src/Artemis.UI.Shared/Plugins/Modules/ModuleViewModel.cs b/src/Artemis.UI.Shared/Plugins/Modules/ModuleViewModel.cs deleted file mode 100644 index 05222aed1..000000000 --- a/src/Artemis.UI.Shared/Plugins/Modules/ModuleViewModel.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Artemis.Core.Modules; -using Stylet; - -namespace Artemis.UI.Shared.Modules -{ - /// - /// The base class for any view model that belongs to a module - /// - public abstract class ModuleViewModel : Screen, IModuleViewModel - { - /// - /// The base class for any view model that belongs to a module - /// - /// The module this view model belongs to - /// The name of the tab that's shown on the modules UI page - protected ModuleViewModel(Module module, string displayName) - { - Module = module; - DisplayName = displayName.ToUpper(); - } - - /// - /// Gets the module this view model belongs to - /// - public Module Module { get; } - } -} \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Plugins/PluginConfigurationDialog.cs b/src/Artemis.UI.Shared/Plugins/PluginConfigurationDialog.cs index 23f1fd0ed..cbc4f7413 100644 --- a/src/Artemis.UI.Shared/Plugins/PluginConfigurationDialog.cs +++ b/src/Artemis.UI.Shared/Plugins/PluginConfigurationDialog.cs @@ -15,9 +15,7 @@ namespace Artemis.UI.Shared /// public abstract class PluginConfigurationDialog : IPluginConfigurationDialog { - /// - /// The type of view model the tab contains - /// + /// public abstract Type Type { get; } } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Plugins/PluginConfigurationViewModel.cs b/src/Artemis.UI.Shared/Plugins/PluginConfigurationViewModel.cs index 61e88a503..4fcfaa4fd 100644 --- a/src/Artemis.UI.Shared/Plugins/PluginConfigurationViewModel.cs +++ b/src/Artemis.UI.Shared/Plugins/PluginConfigurationViewModel.cs @@ -1,12 +1,12 @@ -using Artemis.Core; -using Stylet; +using System; +using Artemis.Core; namespace Artemis.UI.Shared { /// /// Represents a view model for a plugin configuration window /// - public abstract class PluginConfigurationViewModel : Screen, IPluginConfigurationViewModel + public abstract class PluginConfigurationViewModel : ViewModelValidationBase, IPluginConfigurationViewModel { /// /// Creates a new instance of the class @@ -17,19 +17,30 @@ namespace Artemis.UI.Shared Plugin = plugin; } - /// - /// Creates a new instance of the class with a validator - /// - /// - /// - protected PluginConfigurationViewModel(Plugin plugin, IModelValidator validator) : base(validator) - { - Plugin = plugin; - } - /// /// Gets the plugin this configuration view model is associated with /// public Plugin Plugin { get; } + + /// + /// Closes the window hosting the view model + /// + public void Close() + { + CloseRequested?.Invoke(this, EventArgs.Empty); + OnCloseRequested(); + } + + /// + /// Called when the the window hosting the view model should close + /// + public virtual void OnCloseRequested() + { + } + + /// + /// Occurs when the the window hosting the view model should close + /// + public event EventHandler? CloseRequested; } } \ No newline at end of file diff --git a/src/Artemis.UI.Shared/Plugins/ScriptingProviders/ScriptEditorViewModel.cs b/src/Artemis.UI.Shared/Plugins/ScriptingProviders/ScriptEditorViewModel.cs index 957c8429e..416d2614a 100644 --- a/src/Artemis.UI.Shared/Plugins/ScriptingProviders/ScriptEditorViewModel.cs +++ b/src/Artemis.UI.Shared/Plugins/ScriptingProviders/ScriptEditorViewModel.cs @@ -1,12 +1,12 @@ using Artemis.Core.ScriptingProviders; -using Stylet; +using ReactiveUI; namespace Artemis.UI.Shared.ScriptingProviders { /// /// Represents a Stylet view model containing a script editor /// - public class ScriptEditorViewModel : Screen, IScriptEditorViewModel + public class ScriptEditorViewModel : ActivatableViewModelBase, IScriptEditorViewModel { private Script? _script; @@ -42,7 +42,7 @@ namespace Artemis.UI.Shared.ScriptingProviders public Script? Script { get => _script; - internal set => SetAndNotify(ref _script, value); + internal set => RaiseAndSetIfChanged(ref _script, value); } /// diff --git a/src/Artemis.UI.Shared/Properties/Annotations.cs b/src/Artemis.UI.Shared/Properties/Annotations.cs deleted file mode 100644 index 227caf7b8..000000000 --- a/src/Artemis.UI.Shared/Properties/Annotations.cs +++ /dev/null @@ -1,1383 +0,0 @@ -/* MIT License - -Copyright (c) 2016 JetBrains http://www.jetbrains.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. */ - -using System; - -#pragma warning disable 8618 -#pragma warning disable 1591 - -// ReSharper disable InheritdocConsiderUsage -// ReSharper disable UnusedMember.Global -// ReSharper disable MemberCanBePrivate.Global -// ReSharper disable UnusedAutoPropertyAccessor.Global -// ReSharper disable IntroduceOptionalParameters.Global -// ReSharper disable MemberCanBeProtected.Global -// ReSharper disable InconsistentNaming - -namespace Artemis.UI.Shared.Properties -{ - /// - /// Indicates that the value of the marked element could be null sometimes, - /// so checking for null is required before its usage. - /// - /// - /// - /// [CanBeNull] object Test() => null; - /// - /// void UseTest() { - /// var p = Test(); - /// var s = p.ToString(); // Warning: Possible 'System.NullReferenceException' - /// } - /// - /// - [AttributeUsage( - AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | - AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event | - AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.GenericParameter)] - public sealed class CanBeNullAttribute : Attribute - { - } - - /// - /// Indicates that the value of the marked element can never be null. - /// - /// - /// - /// [NotNull] object Foo() { - /// return null; // Warning: Possible 'null' assignment - /// } - /// - /// - [AttributeUsage( - AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | - AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event | - AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.GenericParameter)] - public sealed class NotNullAttribute : Attribute - { - } - - /// - /// Can be applied to symbols of types derived from IEnumerable as well as to symbols of Task - /// and Lazy classes to indicate that the value of a collection item, of the Task.Result property - /// or of the Lazy.Value property can never be null. - /// - /// - /// - /// public void Foo([ItemNotNull]List<string> books) - /// { - /// foreach (var book in books) { - /// if (book != null) // Warning: Expression is always true - /// Console.WriteLine(book.ToUpper()); - /// } - /// } - /// - /// - [AttributeUsage( - AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | - AttributeTargets.Delegate | AttributeTargets.Field)] - public sealed class ItemNotNullAttribute : Attribute - { - } - - /// - /// Can be applied to symbols of types derived from IEnumerable as well as to symbols of Task - /// and Lazy classes to indicate that the value of a collection item, of the Task.Result property - /// or of the Lazy.Value property can be null. - /// - /// - /// - /// public void Foo([ItemCanBeNull]List<string> books) - /// { - /// foreach (var book in books) - /// { - /// // Warning: Possible 'System.NullReferenceException' - /// Console.WriteLine(book.ToUpper()); - /// } - /// } - /// - /// - [AttributeUsage( - AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | - AttributeTargets.Delegate | AttributeTargets.Field)] - public sealed class ItemCanBeNullAttribute : Attribute - { - } - - /// - /// Indicates that the marked method builds string by the format pattern and (optional) arguments. - /// The parameter, which contains the format string, should be given in constructor. The format string - /// should be in -like form. - /// - /// - /// - /// [StringFormatMethod("message")] - /// void ShowError(string message, params object[] args) { /* do something */ } - /// - /// void Foo() { - /// ShowError("Failed: {0}"); // Warning: Non-existing argument in format string - /// } - /// - /// - [AttributeUsage( - AttributeTargets.Constructor | AttributeTargets.Method | - AttributeTargets.Property | AttributeTargets.Delegate)] - public sealed class StringFormatMethodAttribute : Attribute - { - /// - /// Specifies which parameter of an annotated method should be treated as the format string - /// - public StringFormatMethodAttribute([NotNull] string formatParameterName) - { - FormatParameterName = formatParameterName; - } - - [NotNull] - public string FormatParameterName { get; } - } - - /// - /// Use this annotation to specify a type that contains static or const fields - /// with values for the annotated property/field/parameter. - /// The specified type will be used to improve completion suggestions. - /// - /// - /// - /// namespace TestNamespace - /// { - /// public class Constants - /// { - /// public static int INT_CONST = 1; - /// public const string STRING_CONST = "1"; - /// } - /// - /// public class Class1 - /// { - /// [ValueProvider("TestNamespace.Constants")] public int myField; - /// public void Foo([ValueProvider("TestNamespace.Constants")] string str) { } - /// - /// public void Test() - /// { - /// Foo(/*try completion here*/);// - /// myField = /*try completion here*/ - /// } - /// } - /// } - /// - /// - [AttributeUsage( - AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Field, - AllowMultiple = true)] - public sealed class ValueProviderAttribute : Attribute - { - public ValueProviderAttribute([NotNull] string name) - { - Name = name; - } - - [NotNull] - public string Name { get; } - } - - /// - /// Indicates that the function argument should be a string literal and match one - /// of the parameters of the caller function. For example, ReSharper annotates - /// the parameter of . - /// - /// - /// - /// void Foo(string param) { - /// if (param == null) - /// throw new ArgumentNullException("par"); // Warning: Cannot resolve symbol - /// } - /// - /// - [AttributeUsage(AttributeTargets.Parameter)] - public sealed class InvokerParameterNameAttribute : Attribute - { - } - - /// - /// Indicates that the method is contained in a type that implements - /// System.ComponentModel.INotifyPropertyChanged interface and this method - /// is used to notify that some property value changed. - /// - /// - /// The method should be non-static and conform to one of the supported signatures: - /// - /// - /// NotifyChanged(string) - /// - /// - /// NotifyChanged(params string[]) - /// - /// - /// NotifyChanged{T}(Expression{Func{T}}) - /// - /// - /// NotifyChanged{T,U}(Expression{Func{T,U}}) - /// - /// - /// SetProperty{T}(ref T, T, string) - /// - /// - /// - /// - /// - /// public class Foo : INotifyPropertyChanged { - /// public event PropertyChangedEventHandler PropertyChanged; - /// - /// [NotifyPropertyChangedInvocator] - /// protected virtual void NotifyChanged(string propertyName) { ... } - /// - /// string _name; - /// - /// public string Name { - /// get { return _name; } - /// set { _name = value; NotifyChanged("LastName"); /* Warning */ } - /// } - /// } - /// - /// Examples of generated notifications: - /// - /// - /// NotifyChanged("Property") - /// - /// - /// NotifyChanged(() => Property) - /// - /// - /// NotifyChanged((VM x) => x.Property) - /// - /// - /// SetProperty(ref myField, value, "Property") - /// - /// - /// - [AttributeUsage(AttributeTargets.Method)] - public sealed class NotifyPropertyChangedInvocatorAttribute : Attribute - { - public NotifyPropertyChangedInvocatorAttribute() - { - } - - public NotifyPropertyChangedInvocatorAttribute([NotNull] string parameterName) - { - ParameterName = parameterName; - } - - [CanBeNull] - public string ParameterName { get; } - } - - /// - /// Describes dependency between method input and output. - /// - /// - ///

Function Definition Table syntax:

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