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