1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-31 09:43:46 +00:00

Profiles - Fixed event rapid trigger mode not triggering a save

Events - Fixed replacing the event during update breaking existing event conditions
This commit is contained in:
Robert 2021-03-03 20:19:34 +01:00
parent b5f31553c6
commit 18592502fd
4 changed files with 38 additions and 30 deletions

View File

@ -11,9 +11,8 @@ namespace Artemis.Core
public class DataModelConditionEvent : DataModelConditionPart public class DataModelConditionEvent : DataModelConditionPart
{ {
private bool _disposed; private bool _disposed;
private IDataModelEvent? _event;
private bool _eventTriggered;
private bool _reinitializing; private bool _reinitializing;
private DateTime _lastTrigger;
/// <summary> /// <summary>
/// Creates a new instance of the <see cref="DataModelConditionEvent" /> class /// Creates a new instance of the <see cref="DataModelConditionEvent" /> class
@ -53,22 +52,21 @@ namespace Artemis.Core
if (_disposed) if (_disposed)
throw new ObjectDisposedException("DataModelConditionEvent"); throw new ObjectDisposedException("DataModelConditionEvent");
// Ensure the event has not been replaced if (EventPath?.GetValue() is not IDataModelEvent dataModelEvent)
if (EventPath?.GetValue() is IDataModelEvent dataModelEvent && _event != dataModelEvent) return false;
SubscribeToDataModelEvent(dataModelEvent); // Only evaluate to true once every time the event has been triggered since the last evaluation
if (dataModelEvent.LastTrigger <= _lastTrigger)
// Only evaluate to true once every time the event has been triggered
if (!_eventTriggered)
return false; return false;
_eventTriggered = false; _lastTrigger = DateTime.Now;
// If there is a child (root group), it must evaluate to true whenever the event triggered // If there is a child (root group), it must evaluate to true whenever the event triggered
if (Children.Any()) 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 // If there are no children, we always evaluate to true whenever the event triggered
return true; return true;
} }
/// <summary> /// <summary>
@ -132,7 +130,7 @@ namespace Artemis.Core
// Target list // Target list
EventPath?.Save(); EventPath?.Save();
Entity.EventPath = EventPath?.Entity; Entity.EventPath = EventPath?.Entity;
// Children // Children
Entity.Children.Clear(); Entity.Children.Clear();
Entity.Children.AddRange(Children.Select(c => c.GetEntity())); Entity.Children.AddRange(Children.Select(c => c.GetEntity()));
@ -172,16 +170,9 @@ namespace Artemis.Core
Entity.Children.Clear(); Entity.Children.Clear();
AddChild(new DataModelConditionGroup(this)); AddChild(new DataModelConditionGroup(this));
} }
}
private void SubscribeToDataModelEvent(IDataModelEvent dataModelEvent) if (EventPath?.GetValue() is IDataModelEvent dataModelEvent)
{ _lastTrigger = dataModelEvent.LastTrigger;
if (_event != null)
_event.EventTriggered -= OnEventTriggered;
_event = dataModelEvent;
if (_event != null)
_event.EventTriggered += OnEventTriggered;
} }
private Type? GetEventArgumentType() private Type? GetEventArgumentType()
@ -212,11 +203,6 @@ namespace Artemis.Core
#region Event handlers #region Event handlers
private void OnEventTriggered(object? sender, EventArgs e)
{
_eventTriggered = true;
}
private void EventPathOnPathValidated(object? sender, EventArgs e) private void EventPathOnPathValidated(object? sender, EventArgs e)
{ {
if (_reinitializing) if (_reinitializing)

View File

@ -200,7 +200,7 @@
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<RadioButton Grid.Column="0" <RadioButton Grid.Column="0"
Style="{StaticResource MaterialDesignTabRadioButton}" Style="{StaticResource MaterialDesignTabRadioButton}"
IsChecked="{Binding Path=RenderProfileElement.Timeline.EventOverlapMode, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static core:TimeLineEventOverlapMode.Restart}}"> IsChecked="{Binding Path=EventOverlapMode, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static core:TimeLineEventOverlapMode.Restart}}">
<TextBlock VerticalAlignment="Center" FontSize="12"> <TextBlock VerticalAlignment="Center" FontSize="12">
<materialDesign:PackIcon Kind="Repeat" VerticalAlignment="Center" Margin="-3 0 0 -3" /> <materialDesign:PackIcon Kind="Repeat" VerticalAlignment="Center" Margin="-3 0 0 -3" />
RESTART RESTART
@ -215,7 +215,7 @@
</RadioButton> </RadioButton>
<RadioButton Grid.Column="1" <RadioButton Grid.Column="1"
Style="{StaticResource MaterialDesignTabRadioButton}" Style="{StaticResource MaterialDesignTabRadioButton}"
IsChecked="{Binding Path=RenderProfileElement.Timeline.EventOverlapMode, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static core:TimeLineEventOverlapMode.Ignore}}"> IsChecked="{Binding Path=EventOverlapMode, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static core:TimeLineEventOverlapMode.Ignore}}">
<TextBlock VerticalAlignment="Center" FontSize="12"> <TextBlock VerticalAlignment="Center" FontSize="12">
<materialDesign:PackIcon Kind="EarHearingOff" VerticalAlignment="Center" Margin="-3 0 0 -3" /> <materialDesign:PackIcon Kind="EarHearingOff" VerticalAlignment="Center" Margin="-3 0 0 -3" />
IGNORE IGNORE
@ -230,7 +230,7 @@
</RadioButton> </RadioButton>
<RadioButton Grid.Column="2" <RadioButton Grid.Column="2"
Style="{StaticResource MaterialDesignTabRadioButton}" Style="{StaticResource MaterialDesignTabRadioButton}"
IsChecked="{Binding Path=RenderProfileElement.Timeline.EventOverlapMode, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static core:TimeLineEventOverlapMode.Copy}}"> IsChecked="{Binding Path=EventOverlapMode, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static core:TimeLineEventOverlapMode.Copy}}">
<TextBlock VerticalAlignment="Center" FontSize="12"> <TextBlock VerticalAlignment="Center" FontSize="12">
<materialDesign:PackIcon Kind="ContentCopy" VerticalAlignment="Center" Margin="-3 0 0 -3" /> <materialDesign:PackIcon Kind="ContentCopy" VerticalAlignment="Center" Margin="-3 0 0 -3" />
COPY COPY

View File

@ -38,7 +38,13 @@ namespace Artemis.UI.Screens.ProfileEditor.DisplayConditions
public RenderProfileElement RenderProfileElement public RenderProfileElement RenderProfileElement
{ {
get => _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 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; public bool ConditionBehaviourEnabled => RenderProfileElement != null;
protected override void OnInitialActivate() protected override void OnInitialActivate()
@ -119,5 +136,10 @@ namespace Artemis.UI.Screens.ProfileEditor.DisplayConditions
DisplayStartHint = !RenderProfileElement.DisplayCondition.Children.Any(); DisplayStartHint = !RenderProfileElement.DisplayCondition.Children.Any();
IsEventCondition = RenderProfileElement.DisplayCondition.Children.Any(c => c is DataModelConditionEvent); IsEventCondition = RenderProfileElement.DisplayCondition.Children.Any(c => c is DataModelConditionEvent);
} }
public void EventTriggerModeSelected()
{
_profileEditorService.UpdateSelectedProfileElement();
}
} }
} }

View File

@ -127,7 +127,7 @@ namespace Artemis.UI.Screens.Settings.Debug.Tabs
lock (MainDataModel) lock (MainDataModel)
{ {
MainDataModel.Update(_dataModelUIService, null); MainDataModel.Update(_dataModelUIService, new DataModelUpdateConfiguration(true));
} }
} }