From 18592502fd89a725700e6d7ceb011f2a08084b20 Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 3 Mar 2021 20:19:34 +0100 Subject: [PATCH] Profiles - Fixed event rapid trigger mode not triggering a save Events - Fixed replacing the event during update breaking existing event conditions --- .../Conditions/DataModelConditionEvent.cs | 36 ++++++------------- .../DisplayConditionsView.xaml | 6 ++-- .../DisplayConditionsViewModel.cs | 24 ++++++++++++- .../Debug/Tabs/DataModelDebugViewModel.cs | 2 +- 4 files changed, 38 insertions(+), 30 deletions(-) diff --git a/src/Artemis.Core/Models/Profile/Conditions/DataModelConditionEvent.cs b/src/Artemis.Core/Models/Profile/Conditions/DataModelConditionEvent.cs index 49a2a0072..8ae6d5411 100644 --- a/src/Artemis.Core/Models/Profile/Conditions/DataModelConditionEvent.cs +++ b/src/Artemis.Core/Models/Profile/Conditions/DataModelConditionEvent.cs @@ -11,9 +11,8 @@ namespace Artemis.Core public class DataModelConditionEvent : DataModelConditionPart { private bool _disposed; - private IDataModelEvent? _event; - private bool _eventTriggered; private bool _reinitializing; + private DateTime _lastTrigger; /// /// Creates a new instance of the class @@ -53,22 +52,21 @@ namespace Artemis.Core if (_disposed) throw new ObjectDisposedException("DataModelConditionEvent"); - // Ensure the event has not been replaced - if (EventPath?.GetValue() is IDataModelEvent dataModelEvent && _event != dataModelEvent) - SubscribeToDataModelEvent(dataModelEvent); - - // Only evaluate to true once every time the event has been triggered - if (!_eventTriggered) + if (EventPath?.GetValue() is not IDataModelEvent dataModelEvent) + return false; + // Only evaluate to true once every time the event has been triggered since the last evaluation + if (dataModelEvent.LastTrigger <= _lastTrigger) return false; - _eventTriggered = false; + _lastTrigger = DateTime.Now; // If there is a child (root group), it must evaluate to true whenever the event triggered if (Children.Any()) - return Children[0].EvaluateObject(_event?.LastEventArgumentsUntyped); + return Children[0].EvaluateObject(dataModelEvent.LastEventArgumentsUntyped); // If there are no children, we always evaluate to true whenever the event triggered return true; + } /// @@ -132,7 +130,7 @@ namespace Artemis.Core // Target list EventPath?.Save(); Entity.EventPath = EventPath?.Entity; - + // Children Entity.Children.Clear(); Entity.Children.AddRange(Children.Select(c => c.GetEntity())); @@ -172,16 +170,9 @@ namespace Artemis.Core Entity.Children.Clear(); AddChild(new DataModelConditionGroup(this)); } - } - private void SubscribeToDataModelEvent(IDataModelEvent dataModelEvent) - { - if (_event != null) - _event.EventTriggered -= OnEventTriggered; - - _event = dataModelEvent; - if (_event != null) - _event.EventTriggered += OnEventTriggered; + if (EventPath?.GetValue() is IDataModelEvent dataModelEvent) + _lastTrigger = dataModelEvent.LastTrigger; } private Type? GetEventArgumentType() @@ -212,11 +203,6 @@ namespace Artemis.Core #region Event handlers - private void OnEventTriggered(object? sender, EventArgs e) - { - _eventTriggered = true; - } - private void EventPathOnPathValidated(object? sender, EventArgs e) { if (_reinitializing) diff --git a/src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/DisplayConditionsView.xaml b/src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/DisplayConditionsView.xaml index cc49f3d59..05c33df00 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/DisplayConditionsView.xaml +++ b/src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/DisplayConditionsView.xaml @@ -200,7 +200,7 @@ + IsChecked="{Binding Path=EventOverlapMode, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static core:TimeLineEventOverlapMode.Restart}}"> RESTART @@ -215,7 +215,7 @@ + IsChecked="{Binding Path=EventOverlapMode, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static core:TimeLineEventOverlapMode.Ignore}}"> IGNORE @@ -230,7 +230,7 @@ + IsChecked="{Binding Path=EventOverlapMode, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static core:TimeLineEventOverlapMode.Copy}}"> COPY diff --git a/src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/DisplayConditionsViewModel.cs b/src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/DisplayConditionsViewModel.cs index a04d3d563..3f79b19e3 100644 --- a/src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/DisplayConditionsViewModel.cs +++ b/src/Artemis.UI/Screens/ProfileEditor/DisplayConditions/DisplayConditionsViewModel.cs @@ -38,7 +38,13 @@ namespace Artemis.UI.Screens.ProfileEditor.DisplayConditions public RenderProfileElement RenderProfileElement { get => _renderProfileElement; - set => SetAndNotify(ref _renderProfileElement, value); + set + { + if (!SetAndNotify(ref _renderProfileElement, value)) return; + NotifyOfPropertyChange(nameof(DisplayContinuously)); + NotifyOfPropertyChange(nameof(AlwaysFinishTimeline)); + NotifyOfPropertyChange(nameof(EventOverlapMode)); + } } public bool DisplayContinuously @@ -65,6 +71,17 @@ namespace Artemis.UI.Screens.ProfileEditor.DisplayConditions } } + public TimeLineEventOverlapMode EventOverlapMode + { + get => RenderProfileElement?.Timeline.EventOverlapMode ?? TimeLineEventOverlapMode.Restart; + set + { + if (RenderProfileElement == null || RenderProfileElement?.Timeline.EventOverlapMode == value) return; + RenderProfileElement.Timeline.EventOverlapMode = value; + _profileEditorService.UpdateSelectedProfileElement(); + } + } + public bool ConditionBehaviourEnabled => RenderProfileElement != null; protected override void OnInitialActivate() @@ -119,5 +136,10 @@ namespace Artemis.UI.Screens.ProfileEditor.DisplayConditions DisplayStartHint = !RenderProfileElement.DisplayCondition.Children.Any(); IsEventCondition = RenderProfileElement.DisplayCondition.Children.Any(c => c is DataModelConditionEvent); } + + public void EventTriggerModeSelected() + { + _profileEditorService.UpdateSelectedProfileElement(); + } } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Settings/Debug/Tabs/DataModelDebugViewModel.cs b/src/Artemis.UI/Screens/Settings/Debug/Tabs/DataModelDebugViewModel.cs index e2b83d7d0..0e0e97656 100644 --- a/src/Artemis.UI/Screens/Settings/Debug/Tabs/DataModelDebugViewModel.cs +++ b/src/Artemis.UI/Screens/Settings/Debug/Tabs/DataModelDebugViewModel.cs @@ -127,7 +127,7 @@ namespace Artemis.UI.Screens.Settings.Debug.Tabs lock (MainDataModel) { - MainDataModel.Update(_dataModelUIService, null); + MainDataModel.Update(_dataModelUIService, new DataModelUpdateConfiguration(true)); } }