diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/DataModelPicker.axaml b/src/Avalonia/Artemis.UI.Shared/Controls/DataModelPicker.axaml new file mode 100644 index 000000000..4fee1e71a --- /dev/null +++ b/src/Avalonia/Artemis.UI.Shared/Controls/DataModelPicker.axaml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/DataModelPicker.axaml.cs b/src/Avalonia/Artemis.UI.Shared/Controls/DataModelPicker.axaml.cs new file mode 100644 index 000000000..651d0d48c --- /dev/null +++ b/src/Avalonia/Artemis.UI.Shared/Controls/DataModelPicker.axaml.cs @@ -0,0 +1,290 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Reactive; +using Artemis.Core; +using Artemis.Core.Modules; +using Artemis.UI.Shared.DataModelVisualization.Shared; +using Artemis.UI.Shared.Events; +using Artemis.UI.Shared.Services.Interfaces; +using Avalonia; +using Avalonia.Controls.Primitives; +using Avalonia.Data; +using Avalonia.Media; +using ReactiveUI; + +namespace Artemis.UI.Shared.Controls; + +public class DataModelPicker : TemplatedControl +{ + private static IDataModelUIService? _dataModelUIService; + + /// + /// Gets or sets data model path. + /// + public static readonly StyledProperty DataModelPathProperty = + AvaloniaProperty.Register(nameof(DataModelPath), defaultBindingMode: BindingMode.TwoWay, notifying: DataModelPathPropertyChanged); + + /// + /// Gets or sets the placeholder to show when nothing is selected. + /// + public static readonly StyledProperty PlaceholderProperty = + AvaloniaProperty.Register(nameof(Placeholder), "Click to select"); + + /// + /// Gets or sets a boolean indicating whether the data model picker should show current values when selecting a path. + /// + public static readonly StyledProperty ShowDataModelValuesProperty = + AvaloniaProperty.Register(nameof(ShowDataModelValues)); + + /// + /// Gets or sets a boolean indicating whether the data model picker should show the full path of the selected value. + /// + public static readonly StyledProperty ShowFullPathProperty = + AvaloniaProperty.Register(nameof(ShowFullPath), notifying: ShowFullPathPropertyChanged); + + /// + /// Gets or sets the brush to use when drawing the button. + /// + public static readonly StyledProperty ButtonBrushProperty = + AvaloniaProperty.Register(nameof(ButtonBrush)); + + /// + /// A list of extra modules to show data models of. + /// + public static readonly StyledProperty?> ModulesProperty = + AvaloniaProperty.Register?>(nameof(Modules), new ObservableCollection(), notifying: ModulesPropertyChanged); + + /// + /// The data model view model to show, if not provided one will be retrieved by the control. + /// + public static readonly StyledProperty DataModelViewModelProperty = + AvaloniaProperty.Register(nameof(DataModelViewModel), notifying: DataModelViewModelPropertyChanged); + + /// + /// A list of data model view models to show + /// + public static readonly StyledProperty?> ExtraDataModelViewModelsProperty = + AvaloniaProperty.Register?>( + nameof(ExtraDataModelViewModels), + new ObservableCollection(), + notifying: ExtraDataModelViewModelsPropertyChanged + ); + + /// + /// A list of types to filter the selectable paths on. + /// + public static readonly StyledProperty?> FilterTypesProperty = + AvaloniaProperty.Register?>(nameof(FilterTypes), new ObservableCollection()); + + /// + /// Creates a new instance of the class. + /// + public DataModelPicker() + { + SelectPropertyCommand = ReactiveCommand.Create(selected => ExecuteSelectPropertyCommand(selected)); + } + + /// + /// Gets a command that selects the path by it's view model. + /// + public ReactiveCommand SelectPropertyCommand { get; } + + internal static IDataModelUIService DataModelUIService + { + set + { + if (_dataModelUIService != null) + throw new AccessViolationException("This is not for you to touch"); + _dataModelUIService = value; + } + } + + /// + /// Gets or sets data model path. + /// + public DataModelPath? DataModelPath + { + get => GetValue(DataModelPathProperty); + set => SetValue(DataModelPathProperty, value); + } + + /// + /// Gets or sets the placeholder to show when nothing is selected. + /// + public string Placeholder + { + get => GetValue(PlaceholderProperty); + set => SetValue(PlaceholderProperty, value); + } + + /// + /// Gets or sets a boolean indicating whether the data model picker should show the full path of the selected value. + /// + public bool ShowFullPath + { + get => GetValue(ShowFullPathProperty); + set => SetValue(ShowFullPathProperty, value); + } + + /// + /// Gets or sets a boolean indicating whether the data model picker should show current values when selecting a path. + /// + public bool ShowDataModelValues + { + get => GetValue(ShowDataModelValuesProperty); + set => SetValue(ShowDataModelValuesProperty, value); + } + + /// + /// Gets or sets the brush to use when drawing the button. + /// + public Brush ButtonBrush + { + get => GetValue(ButtonBrushProperty); + set => SetValue(ButtonBrushProperty, value); + } + + /// + /// A list of extra modules to show data models of. + /// + public ObservableCollection? Modules + { + get => GetValue(ModulesProperty); + set => SetValue(ModulesProperty, value); + } + + /// + /// The data model view model to show, if not provided one will be retrieved by the control. + /// + public DataModelPropertiesViewModel? DataModelViewModel + { + get => GetValue(DataModelViewModelProperty); + set => SetValue(DataModelViewModelProperty, value); + } + + /// + /// A list of data model view models to show. + /// + public ObservableCollection? ExtraDataModelViewModels + { + get => GetValue(ExtraDataModelViewModelsProperty); + set => SetValue(ExtraDataModelViewModelsProperty, value); + } + + /// + /// A list of types to filter the selectable paths on. + /// + public ObservableCollection? FilterTypes + { + get => GetValue(FilterTypesProperty); + set => SetValue(FilterTypesProperty, 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 ExecuteSelectPropertyCommand(DataModelVisualizationViewModel selected) + { + if (selected.DataModelPath == null) + return; + if (selected.DataModelPath.Equals(DataModelPath)) + return; + + DataModelPath = new DataModelPath(selected.DataModelPath); + OnDataModelPathSelected(new DataModelSelectedEventArgs(DataModelPath)); + } + + private void GetDataModel() + { + if (_dataModelUIService == null) + return; + + 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; + } + + #region Overrides of Visual + + /// + protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) + { + base.OnAttachedToVisualTree(e); + + } + + /// + protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) + { + base.OnDetachedFromVisualTree(e); + } + + #endregion + + 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 static void DataModelPathPropertyChanged(IAvaloniaObject sender, bool before) + { + } + + private static void ShowFullPathPropertyChanged(IAvaloniaObject sender, bool before) + { + } + + private static void ModulesPropertyChanged(IAvaloniaObject sender, bool before) + { + } + + private static void DataModelViewModelPropertyChanged(IAvaloniaObject sender, bool before) + { + } + + private static void ExtraDataModelViewModelsPropertyChanged(IAvaloniaObject sender, bool before) + { + } +} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Controls/SelectionRectangle.cs b/src/Avalonia/Artemis.UI.Shared/Controls/SelectionRectangle.cs index 8094f131e..5c43e5cdb 100644 --- a/src/Avalonia/Artemis.UI.Shared/Controls/SelectionRectangle.cs +++ b/src/Avalonia/Artemis.UI.Shared/Controls/SelectionRectangle.cs @@ -174,6 +174,7 @@ public class SelectionRectangle : Control Point position = e.GetCurrentPoint(null).Position; if (position == _lastPosition) return; + _lastPosition = position; if (!e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) diff --git a/src/Avalonia/Artemis.UI.Shared/Events/DataModelSelectedEventArgs.cs b/src/Avalonia/Artemis.UI.Shared/Events/DataModelSelectedEventArgs.cs new file mode 100644 index 000000000..7f59aedad --- /dev/null +++ b/src/Avalonia/Artemis.UI.Shared/Events/DataModelSelectedEventArgs.cs @@ -0,0 +1,22 @@ +using System; +using Artemis.Core; +using Artemis.UI.Shared.Controls; + +namespace Artemis.UI.Shared.Events +{ + /// + /// Provides data about selection events raised by + /// + public class DataModelSelectedEventArgs : EventArgs + { + /// + /// Gets the data model path that was selected + /// + public DataModelPath? Path { get; } + + internal DataModelSelectedEventArgs(DataModelPath? path) + { + Path = path; + } + } +} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI/Screens/VisualScripting/NodeView.axaml b/src/Avalonia/Artemis.UI/Screens/VisualScripting/NodeView.axaml index ce07fef19..d7b1fb86b 100644 --- a/src/Avalonia/Artemis.UI/Screens/VisualScripting/NodeView.axaml +++ b/src/Avalonia/Artemis.UI/Screens/VisualScripting/NodeView.axaml @@ -26,11 +26,8 @@ - - + @@ -69,7 +65,7 @@ - + diff --git a/src/Avalonia/Artemis.UI/Screens/VisualScripting/NodeView.axaml.cs b/src/Avalonia/Artemis.UI/Screens/VisualScripting/NodeView.axaml.cs index be0b892dc..6e0322bde 100644 --- a/src/Avalonia/Artemis.UI/Screens/VisualScripting/NodeView.axaml.cs +++ b/src/Avalonia/Artemis.UI/Screens/VisualScripting/NodeView.axaml.cs @@ -85,4 +85,9 @@ public class NodeView : ReactiveUserControl e.Handled = true; } + + private void NodeContainer_OnPointerMoved(object? sender, PointerEventArgs e) + { + e.Handled = true; + } } \ No newline at end of file diff --git a/src/Avalonia/Artemis.VisualScripting/Artemis.VisualScripting.csproj b/src/Avalonia/Artemis.VisualScripting/Artemis.VisualScripting.csproj index be4170e96..d6394a424 100644 --- a/src/Avalonia/Artemis.VisualScripting/Artemis.VisualScripting.csproj +++ b/src/Avalonia/Artemis.VisualScripting/Artemis.VisualScripting.csproj @@ -71,4 +71,10 @@ + + + StaticStringValueNodeCustomView.axaml + + + diff --git a/src/Avalonia/Artemis.VisualScripting/Nodes/CustomViews/StaticNumericValueNodeCustomView.axaml b/src/Avalonia/Artemis.VisualScripting/Nodes/CustomViews/StaticNumericValueNodeCustomView.axaml index 53052b696..f4ef79c1a 100644 --- a/src/Avalonia/Artemis.VisualScripting/Nodes/CustomViews/StaticNumericValueNodeCustomView.axaml +++ b/src/Avalonia/Artemis.VisualScripting/Nodes/CustomViews/StaticNumericValueNodeCustomView.axaml @@ -4,11 +4,16 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:customViewModels="clr-namespace:Artemis.VisualScripting.Nodes.CustomViewModels" xmlns:converters="clr-namespace:Artemis.VisualScripting.Converters" + xmlns:controls="clr-namespace:FluentAvalonia.UI.Controls;assembly=FluentAvalonia" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="Artemis.VisualScripting.Nodes.CustomViews.StaticNumericValueNodeCustomView" x:DataType="customViewModels:StaticNumericValueNodeCustomViewModel"> - + \ No newline at end of file diff --git a/src/Avalonia/Artemis.VisualScripting/Nodes/CustomViews/StaticStringValueNodeCustomView.axaml b/src/Avalonia/Artemis.VisualScripting/Nodes/CustomViews/StaticStringValueNodeCustomView.axaml new file mode 100644 index 000000000..966921331 --- /dev/null +++ b/src/Avalonia/Artemis.VisualScripting/Nodes/CustomViews/StaticStringValueNodeCustomView.axaml @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/src/Avalonia/Artemis.VisualScripting/Nodes/CustomViews/StaticStringValueNodeCustomView.axaml.cs b/src/Avalonia/Artemis.VisualScripting/Nodes/CustomViews/StaticStringValueNodeCustomView.axaml.cs new file mode 100644 index 000000000..c619b4b29 --- /dev/null +++ b/src/Avalonia/Artemis.VisualScripting/Nodes/CustomViews/StaticStringValueNodeCustomView.axaml.cs @@ -0,0 +1,18 @@ +using Avalonia.Controls; +using Avalonia.Markup.Xaml; + +namespace Artemis.VisualScripting.Nodes.CustomViews +{ + public partial class StaticStringValueNodeCustomView : UserControl + { + public StaticStringValueNodeCustomView() + { + InitializeComponent(); + } + + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } + } +} diff --git a/src/Avalonia/Artemis.VisualScripting/Nodes/DataModel/CustomViewModels/DataModelEventNodeCustomViewModel.cs b/src/Avalonia/Artemis.VisualScripting/Nodes/DataModel/CustomViewModels/DataModelEventNodeCustomViewModel.cs index daeb894dc..8ebb713a4 100644 --- a/src/Avalonia/Artemis.VisualScripting/Nodes/DataModel/CustomViewModels/DataModelEventNodeCustomViewModel.cs +++ b/src/Avalonia/Artemis.VisualScripting/Nodes/DataModel/CustomViewModels/DataModelEventNodeCustomViewModel.cs @@ -1,15 +1,18 @@ using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Reactive.Disposables; using Artemis.Core; using Artemis.Core.Modules; using Artemis.Core.Services; using Artemis.UI.Shared.VisualScripting; +using ReactiveUI; namespace Artemis.VisualScripting.Nodes.DataModel.CustomViewModels; public class DataModelEventNodeCustomViewModel : CustomNodeViewModel { private readonly DataModelEventNode _node; - private ObservableCollection _modules; + private ObservableCollection? _modules; public DataModelEventNodeCustomViewModel(DataModelEventNode node, ISettingsService settingsService) : base(node) { @@ -17,17 +20,32 @@ public class DataModelEventNodeCustomViewModel : CustomNodeViewModel ShowFullPaths = settingsService.GetSetting("ProfileEditor.ShowFullPaths", true); ShowDataModelValues = settingsService.GetSetting("ProfileEditor.ShowDataModelValues", false); + + this.WhenActivated(d => + { + if (Modules != null) + return; + + Modules = new ObservableCollection(); + if (_node.Script.Context is Profile scriptProfile && scriptProfile.Configuration.Module != null) + Modules.Add(scriptProfile.Configuration.Module); + else if (_node.Script.Context is ProfileConfiguration profileConfiguration && profileConfiguration.Module != null) + Modules.Add(profileConfiguration.Module); + + _node.PropertyChanged += NodeOnPropertyChanged; + Disposable.Create(() => _node.PropertyChanged -= NodeOnPropertyChanged).DisposeWith(d); + }); } public PluginSetting ShowFullPaths { get; } public PluginSetting ShowDataModelValues { get; } public ObservableCollection FilterTypes { get; } = new() {typeof(IDataModelEvent)}; - // public ObservableCollection Modules - // { - // get => _modules; - // set => SetAndNotify(ref _modules, value); - // } + public ObservableCollection? Modules + { + get => _modules; + set => RaiseAndSetIfChanged(ref _modules, value); + } public DataModelPath DataModelPath { @@ -45,28 +63,9 @@ public class DataModelEventNodeCustomViewModel : CustomNodeViewModel } } - // public override void OnActivate() - // { - // if (Modules != null) - // return; - // - // Modules = new ObservableCollection(); - // if (_node.Script.Context is Profile scriptProfile && scriptProfile.Configuration.Module != null) - // Modules.Add(scriptProfile.Configuration.Module); - // else if (_node.Script.Context is ProfileConfiguration profileConfiguration && profileConfiguration.Module != null) - // Modules.Add(profileConfiguration.Module); - // - // _node.PropertyChanged += NodeOnPropertyChanged; - // } - // - // public override void OnDeactivate() - // { - // _node.PropertyChanged -= NodeOnPropertyChanged; - // } - // - // private void NodeOnPropertyChanged(object sender, PropertyChangedEventArgs e) - // { - // if (e.PropertyName == nameof(DataModelNode.DataModelPath)) - // OnPropertyChanged(nameof(DataModelPath)); - // } + private void NodeOnPropertyChanged(object? sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(DataModelNode.DataModelPath)) + this.RaisePropertyChanged(nameof(DataModelPath)); + } } \ No newline at end of file diff --git a/src/Avalonia/Artemis.VisualScripting/Nodes/DataModel/CustomViewModels/DataModelNodeCustomViewModel.cs b/src/Avalonia/Artemis.VisualScripting/Nodes/DataModel/CustomViewModels/DataModelNodeCustomViewModel.cs index f62bc7533..b3a20bec0 100644 --- a/src/Avalonia/Artemis.VisualScripting/Nodes/DataModel/CustomViewModels/DataModelNodeCustomViewModel.cs +++ b/src/Avalonia/Artemis.VisualScripting/Nodes/DataModel/CustomViewModels/DataModelNodeCustomViewModel.cs @@ -1,15 +1,18 @@ using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Reactive.Disposables; using Artemis.Core; using Artemis.Core.Modules; using Artemis.Core.Services; using Artemis.UI.Shared.VisualScripting; +using ReactiveUI; namespace Artemis.VisualScripting.Nodes.DataModel.CustomViewModels; public class DataModelNodeCustomViewModel : CustomNodeViewModel { private readonly DataModelNode _node; - private ObservableCollection _modules; + private ObservableCollection? _modules; public DataModelNodeCustomViewModel(DataModelNode node, ISettingsService settingsService) : base(node) { @@ -17,16 +20,31 @@ public class DataModelNodeCustomViewModel : CustomNodeViewModel ShowFullPaths = settingsService.GetSetting("ProfileEditor.ShowFullPaths", true); ShowDataModelValues = settingsService.GetSetting("ProfileEditor.ShowDataModelValues", false); + + this.WhenActivated(d => + { + if (Modules != null) + return; + + Modules = new ObservableCollection(); + if (_node.Script.Context is Profile scriptProfile && scriptProfile.Configuration.Module != null) + Modules.Add(scriptProfile.Configuration.Module); + else if (_node.Script.Context is ProfileConfiguration profileConfiguration && profileConfiguration.Module != null) + Modules.Add(profileConfiguration.Module); + + _node.PropertyChanged += NodeOnPropertyChanged; + Disposable.Create(() => _node.PropertyChanged -= NodeOnPropertyChanged).DisposeWith(d); + }); } public PluginSetting ShowFullPaths { get; } public PluginSetting ShowDataModelValues { get; } - // public ObservableCollection Modules - // { - // get => _modules; - // set => SetAndNotify(ref _modules, value); - // } + public ObservableCollection? Modules + { + get => _modules; + set => RaiseAndSetIfChanged(ref _modules, value); + } public DataModelPath DataModelPath { @@ -45,28 +63,9 @@ public class DataModelNodeCustomViewModel : CustomNodeViewModel } } - // public override void OnActivate() - // { - // if (Modules != null) - // return; - // - // Modules = new ObservableCollection(); - // if (_node.Script.Context is Profile scriptProfile && scriptProfile.Configuration.Module != null) - // Modules.Add(scriptProfile.Configuration.Module); - // else if (_node.Script.Context is ProfileConfiguration profileConfiguration && profileConfiguration.Module != null) - // Modules.Add(profileConfiguration.Module); - // - // _node.PropertyChanged += NodeOnPropertyChanged; - // } - // - // public override void OnDeactivate() - // { - // _node.PropertyChanged -= NodeOnPropertyChanged; - // } - // - // private void NodeOnPropertyChanged(object sender, PropertyChangedEventArgs e) - // { - // if (e.PropertyName == nameof(DataModelNode.DataModelPath)) - // OnPropertyChanged(nameof(DataModelPath)); - // } + private void NodeOnPropertyChanged(object? sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(DataModelNode.DataModelPath)) + this.RaisePropertyChanged(nameof(DataModelPath)); + } } \ No newline at end of file diff --git a/src/Avalonia/Artemis.VisualScripting/Nodes/DataModel/CustomViews/DataModelEventNodeCustomView.axaml b/src/Avalonia/Artemis.VisualScripting/Nodes/DataModel/CustomViews/DataModelEventNodeCustomView.axaml new file mode 100644 index 000000000..4a13e9c5f --- /dev/null +++ b/src/Avalonia/Artemis.VisualScripting/Nodes/DataModel/CustomViews/DataModelEventNodeCustomView.axaml @@ -0,0 +1,8 @@ + + + diff --git a/src/Avalonia/Artemis.VisualScripting/Nodes/DataModel/CustomViews/DataModelEventNodeCustomView.axaml.cs b/src/Avalonia/Artemis.VisualScripting/Nodes/DataModel/CustomViews/DataModelEventNodeCustomView.axaml.cs new file mode 100644 index 000000000..18a8d72de --- /dev/null +++ b/src/Avalonia/Artemis.VisualScripting/Nodes/DataModel/CustomViews/DataModelEventNodeCustomView.axaml.cs @@ -0,0 +1,19 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; + +namespace Artemis.VisualScripting.Nodes.DataModel.CustomViews +{ + public partial class DataModelEventNodeCustomView : UserControl + { + public DataModelEventNodeCustomView() + { + InitializeComponent(); + } + + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } + } +} diff --git a/src/Avalonia/Artemis.VisualScripting/Nodes/Easing/CustomViews/EasingTypeNodeCustomView.axaml b/src/Avalonia/Artemis.VisualScripting/Nodes/Easing/CustomViews/EasingTypeNodeCustomView.axaml new file mode 100644 index 000000000..c4154fe81 --- /dev/null +++ b/src/Avalonia/Artemis.VisualScripting/Nodes/Easing/CustomViews/EasingTypeNodeCustomView.axaml @@ -0,0 +1,9 @@ + + + diff --git a/src/Avalonia/Artemis.VisualScripting/Nodes/Easing/CustomViews/EasingTypeNodeCustomView.axaml.cs b/src/Avalonia/Artemis.VisualScripting/Nodes/Easing/CustomViews/EasingTypeNodeCustomView.axaml.cs new file mode 100644 index 000000000..7a699a2a5 --- /dev/null +++ b/src/Avalonia/Artemis.VisualScripting/Nodes/Easing/CustomViews/EasingTypeNodeCustomView.axaml.cs @@ -0,0 +1,19 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; + +namespace Artemis.VisualScripting.Nodes.Easing.CustomViews +{ + public partial class EasingTypeNodeCustomView : UserControl + { + public EasingTypeNodeCustomView() + { + InitializeComponent(); + } + + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } + } +} diff --git a/src/Avalonia/Artemis.VisualScripting/Nodes/Easing/CustomViews/EasingTypeNodeCustomView.xaml b/src/Avalonia/Artemis.VisualScripting/Nodes/Easing/CustomViews/EasingTypeNodeCustomView.xaml deleted file mode 100644 index 1930207eb..000000000 --- a/src/Avalonia/Artemis.VisualScripting/Nodes/Easing/CustomViews/EasingTypeNodeCustomView.xaml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file