diff --git a/src/Artemis.Core/Models/Profile/Conditions/DataModelConditionListPredicate.cs b/src/Artemis.Core/Models/Profile/Conditions/DataModelConditionListPredicate.cs
index c5033f1a3..32316ec38 100644
--- a/src/Artemis.Core/Models/Profile/Conditions/DataModelConditionListPredicate.cs
+++ b/src/Artemis.Core/Models/Profile/Conditions/DataModelConditionListPredicate.cs
@@ -93,18 +93,6 @@ namespace Artemis.Core
#region Modification
- ///
- /// Updates the left side of the predicate
- ///
- /// The path pointing to the left side value inside the list
- public override void UpdateLeftSide(DataModelPath? path)
- {
- if (DataModelConditionList.IsPrimitiveList)
- throw new ArtemisCoreException("Cannot apply a left side to a predicate inside a primitive list");
-
- base.UpdateLeftSide(path);
- }
-
///
public override Type? GetPreferredRightSideType()
{
diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListPropertiesViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListPropertiesViewModel.cs
index 0eca0e386..4241b3179 100644
--- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListPropertiesViewModel.cs
+++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListPropertiesViewModel.cs
@@ -15,8 +15,6 @@ namespace Artemis.UI.Shared
{
DataModel = ListPredicateWrapperDataModel.Create(listType);
ListType = listType;
-
- IsRootViewModel = false;
}
public int Index
diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListViewModel.cs
index c4ff3d4eb..2b230020a 100644
--- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListViewModel.cs
+++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelListViewModel.cs
@@ -44,31 +44,7 @@ namespace Artemis.UI.Shared
}
public BindableCollection ListChildren { get; set; }
-
- public DataModelPropertiesViewModel GetListTypeViewModel(IDataModelUIService dataModelUIService)
- {
- Type listType = DataModelPath.GetPropertyType()?.GetGenericEnumerableType();
- if (listType == null)
- return null;
-
- // Create a property VM describing the type of the list
- DataModelVisualizationViewModel viewModel = CreateListChild(dataModelUIService, listType);
- viewModel.Update(dataModelUIService);
-
- // Put an empty value into the list type property view model
- if (viewModel is DataModelListPropertiesViewModel dataModelListClassViewModel) return dataModelListClassViewModel;
-
- if (viewModel is DataModelListPropertyViewModel dataModelListPropertyViewModel)
- {
- dataModelListPropertyViewModel.DisplayValue = Activator.CreateInstance(dataModelListPropertyViewModel.ListType);
- DataModelPropertiesViewModel wrapper = new DataModelPropertiesViewModel(null, null, null);
- wrapper.Children.Add(dataModelListPropertyViewModel);
- return wrapper;
- }
-
- return null;
- }
-
+
public override void Update(IDataModelUIService dataModelUIService)
{
if (Parent != null && !Parent.IsVisualizationExpanded)
diff --git a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelVisualizationViewModel.cs b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelVisualizationViewModel.cs
index ca468a6aa..dd960bc97 100644
--- a/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelVisualizationViewModel.cs
+++ b/src/Artemis.UI.Shared/DataModelVisualization/Shared/DataModelVisualizationViewModel.cs
@@ -142,41 +142,6 @@ namespace Artemis.UI.Shared
IsMatchingFilteredTypes = filteredTypes.Any(t => t == type || t == typeof(Enum) && type.IsEnum);
}
- public DataModelVisualizationViewModel GetChildByPath(Guid dataModelGuid, string propertyPath)
- {
- if (!IsRootViewModel)
- {
- if (DataModel.PluginInfo.Guid != dataModelGuid)
- return null;
- if (propertyPath == null)
- return null;
- if (Path != null && Path.StartsWith(propertyPath, StringComparison.OrdinalIgnoreCase))
- return null;
- }
-
- // Ensure children are populated by requesting an update
- if (!IsVisualizationExpanded)
- {
- IsVisualizationExpanded = true;
- RequestUpdate();
- IsVisualizationExpanded = false;
- }
-
- foreach (DataModelVisualizationViewModel child in Children)
- {
- // Try the child itself first
- if (child.Path == propertyPath)
- return child;
-
- // Try a child on the child next, this will go recursive
- DataModelVisualizationViewModel match = child.GetChildByPath(dataModelGuid, propertyPath);
- if (match != null)
- return match;
- }
-
- return null;
- }
-
internal virtual int GetChildDepth()
{
return 0;
@@ -187,7 +152,7 @@ namespace Artemis.UI.Shared
if (IsRootViewModel && DataModel == null)
return;
- Type modelType = IsRootViewModel ? DataModel.GetType() : DataModelPath?.GetPropertyType() ?? DataModel.GetType();
+ Type modelType = IsRootViewModel ? DataModel.GetType() : DataModelPath.GetPropertyType();
// Add missing static children
foreach (PropertyInfo propertyInfo in modelType.GetProperties(BindingFlags.Public | BindingFlags.Instance).OrderBy(t => t.MetadataToken))
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Conditions/Abstract/DataModelConditionPredicateViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Conditions/Abstract/DataModelConditionPredicateViewModel.cs
index d0542e439..5080adefc 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Conditions/Abstract/DataModelConditionPredicateViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/Conditions/Abstract/DataModelConditionPredicateViewModel.cs
@@ -99,7 +99,11 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
Operators.Clear();
Operators.AddRange(_conditionOperatorService.GetConditionOperatorsForType(leftSideType ?? typeof(object), ConditionParameterSide.Left));
if (DataModelConditionPredicate.Operator == null)
- DataModelConditionPredicate.UpdateOperator(Operators.FirstOrDefault(o => o.SupportsType(leftSideType ?? typeof(object), ConditionParameterSide.Left)));
+ DataModelConditionPredicate.UpdateOperator(Operators.FirstOrDefault());
+ // The core doesn't care about best matches so if there is a new preferred operator, use that instead
+ else if (!Operators.Contains(DataModelConditionPredicate.Operator))
+ DataModelConditionPredicate.UpdateOperator(Operators.FirstOrDefault(o => o.Description == DataModelConditionPredicate.Operator.Description) ?? Operators.FirstOrDefault());
+
SelectedOperator = DataModelConditionPredicate.Operator;
// Without a selected operator or one that supports a right side, leave the right side input empty
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionEventViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionEventViewModel.cs
index d0ba81d0c..98f4d5905 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionEventViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionEventViewModel.cs
@@ -24,13 +24,10 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
_profileEditorService = profileEditorService;
_dataModelUIService = dataModelUIService;
_dataModelConditionsVmFactory = dataModelConditionsVmFactory;
-
- Initialize();
}
public DataModelConditionEvent DataModelConditionEvent => (DataModelConditionEvent) Model;
-
public void Initialize()
{
LeftSideSelectionViewModel = _dataModelUIService.GetDynamicSelectionViewModel(_profileEditorService.GetCurrentModule());
@@ -40,8 +37,15 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
List supportedInputTypes = editors.Select(e => e.SupportedType).ToList();
supportedInputTypes.AddRange(editors.Where(e => e.CompatibleConversionTypes != null).SelectMany(e => e.CompatibleConversionTypes));
supportedInputTypes.Add(typeof(IEnumerable<>));
- LeftSideSelectionViewModel.FilterTypes = supportedInputTypes.ToArray();
+ // Events are only supported in the root group enforce that here
+ if (Parent is DataModelConditionGroupViewModel groupViewModel && groupViewModel.IsRootGroup)
+ {
+ supportedInputTypes.Add(typeof(DataModelEvent));
+ supportedInputTypes.Add(typeof(DataModelEvent<>));
+ }
+
+ LeftSideSelectionViewModel.FilterTypes = supportedInputTypes.ToArray();
LeftSideSelectionViewModel.ButtonBrush = new SolidColorBrush(Color.FromRgb(185, 164, 10));
LeftSideSelectionViewModel.Placeholder = "Select an event";
@@ -91,6 +95,12 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
Update();
}
+ protected override void OnInitialActivate()
+ {
+ Initialize();
+ base.OnInitialActivate();
+ }
+
#region Event handlers
private void LeftSideSelectionViewModelOnPropertySelected(object? sender, DataModelInputDynamicEventArgs e)
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionListViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionListViewModel.cs
index 569cae10b..82986f02a 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionListViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/Conditions/DataModelConditionListViewModel.cs
@@ -26,8 +26,6 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
_profileEditorService = profileEditorService;
_dataModelUIService = dataModelUIService;
_dataModelConditionsVmFactory = dataModelConditionsVmFactory;
-
- Initialize();
}
public DataModelConditionList DataModelConditionList => (DataModelConditionList) Model;
@@ -74,8 +72,15 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
List supportedInputTypes = editors.Select(e => e.SupportedType).ToList();
supportedInputTypes.AddRange(editors.Where(e => e.CompatibleConversionTypes != null).SelectMany(e => e.CompatibleConversionTypes));
supportedInputTypes.Add(typeof(IEnumerable<>));
- LeftSideSelectionViewModel.FilterTypes = supportedInputTypes.ToArray();
+ // Events are only supported in the root group enforce that here
+ if (Parent is DataModelConditionGroupViewModel groupViewModel && groupViewModel.IsRootGroup)
+ {
+ supportedInputTypes.Add(typeof(DataModelEvent));
+ supportedInputTypes.Add(typeof(DataModelEvent<>));
+ }
+
+ LeftSideSelectionViewModel.FilterTypes = supportedInputTypes.ToArray();
LeftSideSelectionViewModel.ButtonBrush = new SolidColorBrush(Color.FromRgb(71, 108, 188));
LeftSideSelectionViewModel.Placeholder = "Select a list";
@@ -88,14 +93,13 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
bool converted = ConvertIfRequired(newType);
if (converted)
return;
-
+
DataModelConditionList.UpdateList(LeftSideSelectionViewModel.DataModelPath);
_profileEditorService.UpdateSelectedProfileElement();
Update();
}
-
-
+
public override void Update()
{
LeftSideSelectionViewModel.ChangeDataModelPath(DataModelConditionList.ListPath);
@@ -127,6 +131,12 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
childViewModel.Update();
}
+ protected override void OnInitialActivate()
+ {
+ Initialize();
+ base.OnInitialActivate();
+ }
+
private void LeftSideSelectionViewModelOnPropertySelected(object? sender, DataModelInputDynamicEventArgs e)
{
ApplyList();
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Conditions/Predicate/DataModelConditionEventPredicateViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/Conditions/Predicate/DataModelConditionEventPredicateViewModel.cs
index fdce7f71d..2b7b8c28c 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Conditions/Predicate/DataModelConditionEventPredicateViewModel.cs
+++ b/src/Artemis.UI/Screens/ProfileEditor/Conditions/Predicate/DataModelConditionEventPredicateViewModel.cs
@@ -12,7 +12,6 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
public class DataModelConditionEventPredicateViewModel : DataModelConditionPredicateViewModel
{
private readonly IDataModelUIService _dataModelUIService;
- private readonly IProfileEditorService _profileEditorService;
public DataModelConditionEventPredicateViewModel(DataModelConditionEventPredicate dataModelConditionEventPredicate,
IProfileEditorService profileEditorService,
@@ -21,11 +20,9 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
ISettingsService settingsService)
: base(dataModelConditionEventPredicate, profileEditorService, dataModelUIService, conditionOperatorService, settingsService)
{
- _profileEditorService = profileEditorService;
_dataModelUIService = dataModelUIService;
LeftSideColor = new SolidColorBrush(Color.FromRgb(185, 164, 10));
- Initialize();
}
public DataModelConditionEventPredicate DataModelConditionEventPredicate => (DataModelConditionEventPredicate) Model;
@@ -38,6 +35,12 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
LeftSideSelectionViewModel.ChangeDataModel(eventDataModel);
}
+ protected override void OnInitialActivate()
+ {
+ base.OnInitialActivate();
+ Initialize();
+ }
+
protected override List GetSupportedInputTypes()
{
IReadOnlyCollection editors = _dataModelUIService.RegisteredDataModelEditors;
diff --git a/src/Artemis.UI/Screens/ProfileEditor/Conditions/Predicate/DataModelConditionListPredicateView.xaml b/src/Artemis.UI/Screens/ProfileEditor/Conditions/Predicate/DataModelConditionListPredicateView.xaml
index d5629fec7..bbdb58f92 100644
--- a/src/Artemis.UI/Screens/ProfileEditor/Conditions/Predicate/DataModelConditionListPredicateView.xaml
+++ b/src/Artemis.UI/Screens/ProfileEditor/Conditions/Predicate/DataModelConditionListPredicateView.xaml
@@ -40,7 +40,7 @@
-
+
(DataModelConditionListPredicate) Model;
@@ -37,14 +32,20 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
base.Initialize();
DataModelPropertiesViewModel listDataModel = GetListDataModel();
- if (listDataModel.Children.Count == 1 && listDataModel.Children.First() is DataModelListPropertyViewModel)
- _isPrimitiveList = true;
- else
- _isPrimitiveList = false;
+ LeftSideSelectionViewModel.ChangeDataModel(listDataModel);
- // Get the data models
- if (!_isPrimitiveList)
- LeftSideSelectionViewModel.ChangeDataModel(listDataModel);
+ // If this is a primitive list the user doesn't have much to choose, so preselect the list item for them
+ if (DataModelConditionListPredicate.DataModelConditionList.IsPrimitiveList && DataModelConditionListPredicate.LeftPath == null)
+ {
+ DataModelConditionListPredicate.UpdateLeftSide(listDataModel.Children.FirstOrDefault()?.DataModelPath);
+ Update();
+ }
+ }
+
+ protected override void OnInitialActivate()
+ {
+ base.OnInitialActivate();
+ Initialize();
}
protected override List GetSupportedInputTypes()
@@ -72,16 +73,11 @@ namespace Artemis.UI.Screens.ProfileEditor.Conditions
private DataModelPropertiesViewModel GetListDataModel()
{
- if (DataModelConditionListPredicate.DataModelConditionList.ListPath?.DataModelGuid == null)
- throw new ArtemisUIException("Failed to retrieve the list data model VM for this list predicate because it has no list path");
-
- DataModelPropertiesViewModel dataModel = _dataModelUIService.GetPluginDataModelVisualization(_profileEditorService.GetCurrentModule(), true);
- DataModelListViewModel listDataModel = (DataModelListViewModel) dataModel.GetChildByPath(
- DataModelConditionListPredicate.DataModelConditionList.ListPath.DataModelGuid.Value,
- DataModelConditionListPredicate.DataModelConditionList.ListPath.Path
+ ListPredicateWrapperDataModel wrapper = ListPredicateWrapperDataModel.Create(
+ DataModelConditionListPredicate.DataModelConditionList.ListType
);
- return listDataModel.GetListTypeViewModel(_dataModelUIService);
+ return wrapper.CreateViewModel(_dataModelUIService);
}
}
}
\ No newline at end of file