1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +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));
else if (childEntity is DataModelConditionListEntity listEntity)
AddChild(new DataModelConditionList(this, listEntity));
else if (childEntity is DataModelConditionEventEntity eventEntity)
AddChild(new DataModelConditionEvent(this, eventEntity));
else if (childEntity is DataModelConditionPredicateEntity predicateEntity)
AddChild(new DataModelConditionPredicate(this, predicateEntity));
else if (childEntity is DataModelConditionListPredicateEntity listPredicateEntity)

View File

@ -235,7 +235,6 @@ namespace Artemis.UI.Shared
if (toRemoveDynamic.Any())
Children.RemoveRange(toRemoveDynamic);
}
private DataModelVisualizationViewModel CreateChild(IDataModelUIService dataModelUIService, string path, int depth)
{
if (depth > MaxDepth)
@ -265,7 +264,7 @@ namespace Artemis.UI.Shared
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 };
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};

View File

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

View File

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

View File

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

View File

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