1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2026-01-01 02:03:32 +00:00

Data model events - Improved condition conversion code

This commit is contained in:
SpoinkyNL 2020-10-22 19:36:24 +02:00
parent 03b0e83ed8
commit b8fa8779d9
10 changed files with 157 additions and 80 deletions

View File

@ -40,6 +40,8 @@ namespace Artemis.Core
AddChild(new DataModelConditionGroup(this, groupEntity)); AddChild(new DataModelConditionGroup(this, groupEntity));
else if (childEntity is DataModelConditionListEntity listEntity) else if (childEntity is DataModelConditionListEntity listEntity)
AddChild(new DataModelConditionList(this, listEntity)); AddChild(new DataModelConditionList(this, listEntity));
else if (childEntity is DataModelConditionEventEntity eventEntity)
AddChild(new DataModelConditionEvent(this, eventEntity));
else if (childEntity is DataModelConditionPredicateEntity predicateEntity) else if (childEntity is DataModelConditionPredicateEntity predicateEntity)
AddChild(new DataModelConditionPredicate(this, predicateEntity)); AddChild(new DataModelConditionPredicate(this, predicateEntity));
else if (childEntity is DataModelConditionListPredicateEntity listPredicateEntity) else if (childEntity is DataModelConditionListPredicateEntity listPredicateEntity)

View File

@ -235,7 +235,6 @@ namespace Artemis.UI.Shared
if (toRemoveDynamic.Any()) if (toRemoveDynamic.Any())
Children.RemoveRange(toRemoveDynamic); Children.RemoveRange(toRemoveDynamic);
} }
private DataModelVisualizationViewModel CreateChild(IDataModelUIService dataModelUIService, string path, int depth) private DataModelVisualizationViewModel CreateChild(IDataModelUIService dataModelUIService, string path, int depth)
{ {
if (depth > MaxDepth) if (depth > MaxDepth)
@ -265,7 +264,7 @@ namespace Artemis.UI.Shared
if (propertyType.IsGenericEnumerable()) if (propertyType.IsGenericEnumerable())
return new DataModelListViewModel(DataModel, this, dataModelPath) {Depth = depth}; return new DataModelListViewModel(DataModel, this, dataModelPath) {Depth = depth};
if (propertyType == typeof(DataModelEvent) || propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(DataModelEvent<>)) if (propertyType == typeof(DataModelEvent) || propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(DataModelEvent<>))
return new DataModelEventViewModel(DataModel, this, dataModelPath) { Depth = depth }; return new DataModelEventViewModel(DataModel, this, dataModelPath) {Depth = depth};
// For other value types create a child view model // For other value types create a child view model
if (propertyType.IsClass || propertyType.IsStruct()) if (propertyType.IsClass || propertyType.IsStruct())
return new DataModelPropertiesViewModel(DataModel, this, dataModelPath) {Depth = depth}; return new DataModelPropertiesViewModel(DataModel, this, dataModelPath) {Depth = depth};

View File

@ -67,6 +67,7 @@ namespace Artemis.UI.Ninject.Factories
{ {
DataModelConditionGroupViewModel DataModelConditionGroupViewModel(DataModelConditionGroup dataModelConditionGroup, bool isListGroup); DataModelConditionGroupViewModel DataModelConditionGroupViewModel(DataModelConditionGroup dataModelConditionGroup, bool isListGroup);
DataModelConditionListViewModel DataModelConditionListViewModel(DataModelConditionList dataModelConditionList); DataModelConditionListViewModel DataModelConditionListViewModel(DataModelConditionList dataModelConditionList);
DataModelConditionEventViewModel DataModelConditionEventViewModel(DataModelConditionEvent dataModelConditionEvent);
DataModelConditionPredicateViewModel DataModelConditionPredicateViewModel(DataModelConditionPredicate dataModelConditionPredicate); DataModelConditionPredicateViewModel DataModelConditionPredicateViewModel(DataModelConditionPredicate dataModelConditionPredicate);
DataModelConditionListPredicateViewModel DataModelConditionListPredicateViewModel(DataModelConditionListPredicate dataModelConditionListPredicate); DataModelConditionListPredicateViewModel DataModelConditionListPredicateViewModel(DataModelConditionListPredicate dataModelConditionListPredicate);
} }

View File

@ -1,10 +1,14 @@
using Artemis.Core; using System;
using Artemis.Core;
using Artemis.UI.Shared.Input;
using Stylet; using Stylet;
namespace Artemis.UI.Screens.ProfileEditor.Conditions.Abstract namespace Artemis.UI.Screens.ProfileEditor.Conditions.Abstract
{ {
public abstract class DataModelConditionViewModel : Conductor<DataModelConditionViewModel>.Collection.AllActive public abstract class DataModelConditionViewModel : Conductor<DataModelConditionViewModel>.Collection.AllActive
{ {
private DataModelDynamicViewModel _leftSideSelectionViewModel;
protected DataModelConditionViewModel(DataModelConditionPart model) protected DataModelConditionViewModel(DataModelConditionPart model)
{ {
Model = model; Model = model;
@ -12,6 +16,12 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions.Abstract
public DataModelConditionPart Model { get; } public DataModelConditionPart Model { get; }
public DataModelDynamicViewModel LeftSideSelectionViewModel
{
get => _leftSideSelectionViewModel;
set => SetAndNotify(ref _leftSideSelectionViewModel, value);
}
public abstract void Update(); public abstract void Update();
public virtual void Delete() public virtual void Delete()
@ -19,5 +29,43 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions.Abstract
Model.Parent.RemoveChild(Model); Model.Parent.RemoveChild(Model);
((DataModelConditionViewModel) Parent).Update(); ((DataModelConditionViewModel) Parent).Update();
} }
protected bool ConvertIfRequired(Type newType)
{
if (newType == null)
return false;
if (!(Parent is DataModelConditionGroupViewModel groupViewModel))
return false;
// List
if (newType.IsGenericEnumerable())
{
if (this is DataModelConditionListViewModel)
return false;
groupViewModel.ConvertToConditionList(this);
return true;
}
// Event
if (IsEvent(newType))
{
if (this is DataModelConditionEventViewModel)
return false;
groupViewModel.ConvertToConditionEvent(this);
return true;
}
// Predicate
if (this is DataModelConditionPredicateViewModel)
return false;
groupViewModel.ConvertToPredicate(this);
return true;
}
protected bool IsEvent(Type type)
{
return type == typeof(DataModelEvent) || type.IsGenericType && type.GetGenericTypeDefinition() == typeof(DataModelEvent<>);
}
} }
} }

View File

@ -0,0 +1,47 @@
<UserControl x:Class="Artemis.UI.Screens.ProfileEditor.Conditions.DataModelConditionEventView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Artemis.UI.Screens.ProfileEditor.Conditions"
xmlns:s="https://github.com/canton7/Stylet"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Artemis.UI;component/ResourceDictionaries/DataModelConditions.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid Margin="0 3">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Button Grid.Row="0"
Grid.Column="0"
ToolTip="Delete the event trigger"
Style="{StaticResource MaterialDesignIconForegroundButton}"
HorizontalAlignment="Left"
Foreground="#E74C4C"
Width="25"
Height="25"
Command="{s:Action Delete}">
<materialDesign:PackIcon Kind="Close" Width="18" Height="18" />
</Button>
<!-- Left side, the list this predicate is targeting -->
<ContentControl Grid.Row="0"
Grid.Column="1"
s:View.Model="{Binding LeftSideSelectionViewModel}"
VerticalContentAlignment="Stretch"
HorizontalContentAlignment="Stretch"
IsTabStop="False" />
</Grid>
</UserControl>

View File

@ -1,13 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using System.Windows.Media; using System.Windows.Media;
using Artemis.Core; using Artemis.Core;
using Artemis.UI.Ninject.Factories; using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.ProfileEditor.Conditions.Abstract; using Artemis.UI.Screens.ProfileEditor.Conditions.Abstract;
using Artemis.UI.Shared; using Artemis.UI.Shared;
using Artemis.UI.Shared.Input;
using Artemis.UI.Shared.Services; using Artemis.UI.Shared.Services;
namespace Artemis.UI.Screens.ProfileEditor.Conditions namespace Artemis.UI.Screens.ProfileEditor.Conditions
@ -17,12 +15,11 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
private readonly IDataModelConditionsVmFactory _dataModelConditionsVmFactory; private readonly IDataModelConditionsVmFactory _dataModelConditionsVmFactory;
private readonly IDataModelUIService _dataModelUIService; private readonly IDataModelUIService _dataModelUIService;
private readonly IProfileEditorService _profileEditorService; private readonly IProfileEditorService _profileEditorService;
private DataModelDynamicViewModel _targetSelectionViewModel;
public DataModelConditionEventViewModel(DataModelConditionEvent model, public DataModelConditionEventViewModel(DataModelConditionEvent dataModelConditionEvent,
IProfileEditorService profileEditorService, IProfileEditorService profileEditorService,
IDataModelUIService dataModelUIService, IDataModelUIService dataModelUIService,
IDataModelConditionsVmFactory dataModelConditionsVmFactory) : base(model) IDataModelConditionsVmFactory dataModelConditionsVmFactory) : base(dataModelConditionEvent)
{ {
_profileEditorService = profileEditorService; _profileEditorService = profileEditorService;
_dataModelUIService = dataModelUIService; _dataModelUIService = dataModelUIService;
@ -33,39 +30,37 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
public DataModelConditionEvent DataModelConditionEvent => (DataModelConditionEvent) Model; public DataModelConditionEvent DataModelConditionEvent => (DataModelConditionEvent) Model;
public DataModelDynamicViewModel TargetSelectionViewModel
{
get => _targetSelectionViewModel;
set => SetAndNotify(ref _targetSelectionViewModel, value);
}
public void Initialize() public void Initialize()
{ {
TargetSelectionViewModel = _dataModelUIService.GetDynamicSelectionViewModel(_profileEditorService.GetCurrentModule()); LeftSideSelectionViewModel = _dataModelUIService.GetDynamicSelectionViewModel(_profileEditorService.GetCurrentModule());
TargetSelectionViewModel.PropertySelected += TargetSelectionViewModelOnPropertySelected; LeftSideSelectionViewModel.PropertySelected += LeftSideSelectionViewModelOnPropertySelected;
IReadOnlyCollection<DataModelVisualizationRegistration> editors = _dataModelUIService.RegisteredDataModelEditors; IReadOnlyCollection<DataModelVisualizationRegistration> editors = _dataModelUIService.RegisteredDataModelEditors;
List<Type> supportedInputTypes = editors.Select(e => e.SupportedType).ToList(); List<Type> supportedInputTypes = editors.Select(e => e.SupportedType).ToList();
supportedInputTypes.AddRange(editors.Where(e => e.CompatibleConversionTypes != null).SelectMany(e => e.CompatibleConversionTypes)); supportedInputTypes.AddRange(editors.Where(e => e.CompatibleConversionTypes != null).SelectMany(e => e.CompatibleConversionTypes));
supportedInputTypes.Add(typeof(IEnumerable<>)); supportedInputTypes.Add(typeof(IEnumerable<>));
TargetSelectionViewModel.FilterTypes = supportedInputTypes.ToArray(); LeftSideSelectionViewModel.FilterTypes = supportedInputTypes.ToArray();
TargetSelectionViewModel.ButtonBrush = new SolidColorBrush(Color.FromRgb(188, 174, 71)); LeftSideSelectionViewModel.ButtonBrush = new SolidColorBrush(Color.FromRgb(185, 164, 10));
TargetSelectionViewModel.Placeholder = "Select a list"; LeftSideSelectionViewModel.Placeholder = "Select an event";
Update(); Update();
} }
public override void Update()
{
LeftSideSelectionViewModel.ChangeDataModelPath(DataModelConditionEvent.EventPath);
}
public void ApplyEvent() public void ApplyEvent()
{ {
if (!TargetSelectionViewModel.DataModelPath.GetPropertyType().IsGenericEnumerable()) Type newType = LeftSideSelectionViewModel.DataModelPath.GetPropertyType();
{ bool converted = ConvertIfRequired(newType);
if (Parent is DataModelConditionGroupViewModel groupViewModel) if (converted)
groupViewModel.ConvertToPredicate(this);
return; return;
}
DataModelConditionEvent.UpdateEvent(TargetSelectionViewModel.DataModelPath); DataModelConditionEvent.UpdateEvent(LeftSideSelectionViewModel.DataModelPath);
_profileEditorService.UpdateSelectedProfileElement(); _profileEditorService.UpdateSelectedProfileElement();
Update(); Update();
@ -73,7 +68,7 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
#region Event handlers #region Event handlers
private void TargetSelectionViewModelOnPropertySelected(object? sender, DataModelInputDynamicEventArgs e) private void LeftSideSelectionViewModelOnPropertySelected(object? sender, DataModelInputDynamicEventArgs e)
{ {
ApplyEvent(); ApplyEvent();
} }
@ -84,8 +79,8 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
public void Dispose() public void Dispose()
{ {
TargetSelectionViewModel.Dispose(); LeftSideSelectionViewModel.Dispose();
TargetSelectionViewModel.PropertySelected -= TargetSelectionViewModelOnPropertySelected; LeftSideSelectionViewModel.PropertySelected -= LeftSideSelectionViewModelOnPropertySelected;
} }
#endregion #endregion

View File

@ -100,19 +100,22 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
switch (childModel) switch (childModel)
{ {
case DataModelConditionGroup DataModelConditionGroup: case DataModelConditionGroup dataModelConditionGroup:
viewModels.Add(_dataModelConditionsVmFactory.DataModelConditionGroupViewModel(DataModelConditionGroup, IsListGroup)); viewModels.Add(_dataModelConditionsVmFactory.DataModelConditionGroupViewModel(dataModelConditionGroup, IsListGroup));
break; break;
case DataModelConditionList DataModelConditionListPredicate: case DataModelConditionList dataModelConditionList:
viewModels.Add(_dataModelConditionsVmFactory.DataModelConditionListViewModel(DataModelConditionListPredicate)); viewModels.Add(_dataModelConditionsVmFactory.DataModelConditionListViewModel(dataModelConditionList));
break; break;
case DataModelConditionPredicate DataModelConditionPredicate: case DataModelConditionEvent dataModelConditionEvent:
viewModels.Add(_dataModelConditionsVmFactory.DataModelConditionEventViewModel(dataModelConditionEvent));
break;
case DataModelConditionPredicate dataModelConditionPredicate:
if (!IsListGroup) if (!IsListGroup)
viewModels.Add(_dataModelConditionsVmFactory.DataModelConditionPredicateViewModel(DataModelConditionPredicate)); viewModels.Add(_dataModelConditionsVmFactory.DataModelConditionPredicateViewModel(dataModelConditionPredicate));
break; break;
case DataModelConditionListPredicate DataModelConditionListPredicate: case DataModelConditionListPredicate dataModelConditionListPredicate:
if (IsListGroup) if (IsListGroup)
viewModels.Add(_dataModelConditionsVmFactory.DataModelConditionListPredicateViewModel(DataModelConditionListPredicate)); viewModels.Add(_dataModelConditionsVmFactory.DataModelConditionListPredicateViewModel(dataModelConditionListPredicate));
break; break;
} }
} }
@ -132,7 +135,7 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
OnUpdated(); OnUpdated();
} }
public void ConvertToConditionList(DataModelConditionPredicateViewModel predicateViewModel) public void ConvertToConditionList(DataModelConditionViewModel predicateViewModel)
{ {
// Store the old index and remove the old predicate // Store the old index and remove the old predicate
int index = DataModelConditionGroup.Children.IndexOf(predicateViewModel.Model); int index = DataModelConditionGroup.Children.IndexOf(predicateViewModel.Model);
@ -147,7 +150,7 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
Update(); Update();
} }
public void ConvertToConditionEvent(DataModelConditionPredicateViewModel predicateViewModel) public void ConvertToConditionEvent(DataModelConditionViewModel predicateViewModel)
{ {
// Remove the old child // Remove the old child
DataModelConditionGroup.RemoveChild(predicateViewModel.Model); DataModelConditionGroup.RemoveChild(predicateViewModel.Model);
@ -165,7 +168,7 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
Update(); Update();
} }
public void ConvertToPredicate(DataModelConditionListViewModel listViewModel) public void ConvertToPredicate(DataModelConditionViewModel listViewModel)
{ {
// Store the old index and remove the old predicate // Store the old index and remove the old predicate
int index = DataModelConditionGroup.Children.IndexOf(listViewModel.Model); int index = DataModelConditionGroup.Children.IndexOf(listViewModel.Model);
@ -173,7 +176,7 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
// Insert a list in the same position // Insert a list in the same position
DataModelConditionPredicate predicate = new DataModelConditionPredicate(DataModelConditionGroup, ProfileRightSideType.Dynamic); DataModelConditionPredicate predicate = new DataModelConditionPredicate(DataModelConditionGroup, ProfileRightSideType.Dynamic);
predicate.UpdateLeftSide(listViewModel.TargetSelectionViewModel.DataModelPath); predicate.UpdateLeftSide(listViewModel.LeftSideSelectionViewModel.DataModelPath);
DataModelConditionGroup.AddChild(predicate, index); DataModelConditionGroup.AddChild(predicate, index);
// Update to switch the VMs // Update to switch the VMs

View File

@ -41,7 +41,7 @@
<!-- Left side, the list this predicate is targeting --> <!-- Left side, the list this predicate is targeting -->
<ContentControl Grid.Row="0" <ContentControl Grid.Row="0"
Grid.Column="1" Grid.Column="1"
s:View.Model="{Binding TargetSelectionViewModel}" s:View.Model="{Binding LeftSideSelectionViewModel}"
VerticalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
HorizontalContentAlignment="Stretch" HorizontalContentAlignment="Stretch"
IsTabStop="False" /> IsTabStop="False" />

View File

@ -1,5 +1,4 @@
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Windows.Media; using System.Windows.Media;
@ -7,7 +6,6 @@ using Artemis.Core;
using Artemis.UI.Ninject.Factories; using Artemis.UI.Ninject.Factories;
using Artemis.UI.Screens.ProfileEditor.Conditions.Abstract; using Artemis.UI.Screens.ProfileEditor.Conditions.Abstract;
using Artemis.UI.Shared; using Artemis.UI.Shared;
using Artemis.UI.Shared.Input;
using Artemis.UI.Shared.Services; using Artemis.UI.Shared.Services;
using Humanizer; using Humanizer;
@ -18,7 +16,6 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
private readonly IDataModelConditionsVmFactory _dataModelConditionsVmFactory; private readonly IDataModelConditionsVmFactory _dataModelConditionsVmFactory;
private readonly IDataModelUIService _dataModelUIService; private readonly IDataModelUIService _dataModelUIService;
private readonly IProfileEditorService _profileEditorService; private readonly IProfileEditorService _profileEditorService;
private DataModelDynamicViewModel _targetSelectionViewModel;
public DataModelConditionListViewModel( public DataModelConditionListViewModel(
DataModelConditionList dataModelConditionList, DataModelConditionList dataModelConditionList,
@ -33,22 +30,10 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
Initialize(); Initialize();
} }
public DataModelDynamicViewModel TargetSelectionViewModel
{
get => _targetSelectionViewModel;
set => SetAndNotify(ref _targetSelectionViewModel, value);
}
public DataModelConditionList DataModelConditionList => (DataModelConditionList) Model; public DataModelConditionList DataModelConditionList => (DataModelConditionList) Model;
public string SelectedListOperator => DataModelConditionList.ListOperator.Humanize(); public string SelectedListOperator => DataModelConditionList.ListOperator.Humanize();
public void Dispose()
{
TargetSelectionViewModel.Dispose();
TargetSelectionViewModel.PropertySelected -= TargetSelectionViewModelOnPropertySelected;
}
public void SelectListOperator(string type) public void SelectListOperator(string type)
{ {
ListOperator enumValue = Enum.Parse<ListOperator>(type); ListOperator enumValue = Enum.Parse<ListOperator>(type);
@ -82,38 +67,38 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
public void Initialize() public void Initialize()
{ {
TargetSelectionViewModel = _dataModelUIService.GetDynamicSelectionViewModel(_profileEditorService.GetCurrentModule()); LeftSideSelectionViewModel = _dataModelUIService.GetDynamicSelectionViewModel(_profileEditorService.GetCurrentModule());
TargetSelectionViewModel.PropertySelected += TargetSelectionViewModelOnPropertySelected; LeftSideSelectionViewModel.PropertySelected += LeftSideSelectionViewModelOnPropertySelected;
IReadOnlyCollection<DataModelVisualizationRegistration> editors = _dataModelUIService.RegisteredDataModelEditors; IReadOnlyCollection<DataModelVisualizationRegistration> editors = _dataModelUIService.RegisteredDataModelEditors;
List<Type> supportedInputTypes = editors.Select(e => e.SupportedType).ToList(); List<Type> supportedInputTypes = editors.Select(e => e.SupportedType).ToList();
supportedInputTypes.AddRange(editors.Where(e => e.CompatibleConversionTypes != null).SelectMany(e => e.CompatibleConversionTypes)); supportedInputTypes.AddRange(editors.Where(e => e.CompatibleConversionTypes != null).SelectMany(e => e.CompatibleConversionTypes));
supportedInputTypes.Add(typeof(IEnumerable<>)); supportedInputTypes.Add(typeof(IEnumerable<>));
TargetSelectionViewModel.FilterTypes = supportedInputTypes.ToArray(); LeftSideSelectionViewModel.FilterTypes = supportedInputTypes.ToArray();
TargetSelectionViewModel.ButtonBrush = new SolidColorBrush(Color.FromRgb(71, 108, 188)); LeftSideSelectionViewModel.ButtonBrush = new SolidColorBrush(Color.FromRgb(71, 108, 188));
TargetSelectionViewModel.Placeholder = "Select a list"; LeftSideSelectionViewModel.Placeholder = "Select a list";
Update(); Update();
} }
public void ApplyList() public void ApplyList()
{ {
if (!TargetSelectionViewModel.DataModelPath.GetPropertyType().IsGenericEnumerable()) Type newType = LeftSideSelectionViewModel.DataModelPath.GetPropertyType();
{ bool converted = ConvertIfRequired(newType);
if (Parent is DataModelConditionGroupViewModel groupViewModel) if (converted)
groupViewModel.ConvertToPredicate(this);
return; return;
}
DataModelConditionList.UpdateList(TargetSelectionViewModel.DataModelPath); DataModelConditionList.UpdateList(LeftSideSelectionViewModel.DataModelPath);
_profileEditorService.UpdateSelectedProfileElement(); _profileEditorService.UpdateSelectedProfileElement();
Update(); Update();
} }
public override void Update() public override void Update()
{ {
TargetSelectionViewModel.ChangeDataModelPath(DataModelConditionList.ListPath); LeftSideSelectionViewModel.ChangeDataModelPath(DataModelConditionList.ListPath);
NotifyOfPropertyChange(nameof(SelectedListOperator)); NotifyOfPropertyChange(nameof(SelectedListOperator));
// Remove VMs of effects no longer applied on the layer // Remove VMs of effects no longer applied on the layer
@ -142,9 +127,15 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
childViewModel.Update(); childViewModel.Update();
} }
private void TargetSelectionViewModelOnPropertySelected(object? sender, DataModelInputDynamicEventArgs e) private void LeftSideSelectionViewModelOnPropertySelected(object? sender, DataModelInputDynamicEventArgs e)
{ {
ApplyList(); ApplyList();
} }
public void Dispose()
{
LeftSideSelectionViewModel.Dispose();
LeftSideSelectionViewModel.PropertySelected -= LeftSideSelectionViewModelOnPropertySelected;
}
} }
} }

View File

@ -18,7 +18,6 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
private readonly IConditionOperatorService _conditionOperatorService; private readonly IConditionOperatorService _conditionOperatorService;
private readonly IDataModelUIService _dataModelUIService; private readonly IDataModelUIService _dataModelUIService;
private readonly IProfileEditorService _profileEditorService; private readonly IProfileEditorService _profileEditorService;
private DataModelDynamicViewModel _leftSideSelectionViewModel;
private BindableCollection<BaseConditionOperator> _operators; private BindableCollection<BaseConditionOperator> _operators;
private DataModelStaticViewModel _rightSideInputViewModel; private DataModelStaticViewModel _rightSideInputViewModel;
private DataModelDynamicViewModel _rightSideSelectionViewModel; private DataModelDynamicViewModel _rightSideSelectionViewModel;
@ -56,12 +55,6 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
set => SetAndNotify(ref _operators, value); set => SetAndNotify(ref _operators, value);
} }
public DataModelDynamicViewModel LeftSideSelectionViewModel
{
get => _leftSideSelectionViewModel;
set => SetAndNotify(ref _leftSideSelectionViewModel, value);
}
public BaseConditionOperator SelectedOperator public BaseConditionOperator SelectedOperator
{ {
get => _selectedOperator; get => _selectedOperator;
@ -151,12 +144,10 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
public void ApplyLeftSide() public void ApplyLeftSide()
{ {
if (LeftSideSelectionViewModel.DataModelPath.GetPropertyType().IsGenericEnumerable()) Type newType = LeftSideSelectionViewModel.DataModelPath.GetPropertyType();
{ bool converted = ConvertIfRequired(newType);
if (Parent is DataModelConditionGroupViewModel groupViewModel) if (converted)
groupViewModel.ConvertToConditionList(this);
return; return;
}
DataModelConditionPredicate.UpdateLeftSide(LeftSideSelectionViewModel.DataModelPath); DataModelConditionPredicate.UpdateLeftSide(LeftSideSelectionViewModel.DataModelPath);
_profileEditorService.UpdateSelectedProfileElement(); _profileEditorService.UpdateSelectedProfileElement();