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