1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00
Artemis/src/Artemis.Core/Models/Profile/Conditions/DisplayConditionGroup.cs
2020-08-11 22:54:14 +02:00

88 lines
3.1 KiB
C#

using System;
using System.Linq;
using Artemis.Core.Models.Profile.Conditions.Abstract;
using Artemis.Core.Services.Interfaces;
using Artemis.Storage.Entities.Profile;
using Artemis.Storage.Entities.Profile.Abstract;
namespace Artemis.Core.Models.Profile.Conditions
{
public class DisplayConditionGroup : DisplayConditionPart
{
public DisplayConditionGroup(DisplayConditionPart parent)
{
Parent = parent;
DisplayConditionGroupEntity = new DisplayConditionGroupEntity();
}
public DisplayConditionGroup(DisplayConditionPart parent, DisplayConditionGroupEntity entity)
{
Parent = parent;
DisplayConditionGroupEntity = entity;
BooleanOperator = (BooleanOperator) DisplayConditionGroupEntity.BooleanOperator;
foreach (var childEntity in DisplayConditionGroupEntity.Children)
{
if (childEntity is DisplayConditionGroupEntity groupEntity)
AddChild(new DisplayConditionGroup(this, groupEntity));
else if (childEntity is DisplayConditionPredicateEntity predicateEntity)
AddChild(new DisplayConditionPredicate(this, predicateEntity));
else if (childEntity is DisplayConditionListPredicateEntity listPredicateEntity)
AddChild(new DisplayConditionListPredicate(this, listPredicateEntity));
}
}
public BooleanOperator BooleanOperator { get; set; }
public DisplayConditionGroupEntity DisplayConditionGroupEntity { get; set; }
public override bool Evaluate()
{
// If there are less than two children, ignore the boolean operator
if (Children.Count <= 2)
return Children.All(c => c.Evaluate());
switch (BooleanOperator)
{
case BooleanOperator.And:
return Children.All(c => c.Evaluate());
case BooleanOperator.Or:
return Children.Any(c => c.Evaluate());
case BooleanOperator.AndNot:
return Children.All(c => !c.Evaluate());
case BooleanOperator.OrNot:
return Children.Any(c => !c.Evaluate());
default:
throw new ArgumentOutOfRangeException();
}
}
internal override void ApplyToEntity()
{
DisplayConditionGroupEntity.BooleanOperator = (int) BooleanOperator;
DisplayConditionGroupEntity.Children.Clear();
DisplayConditionGroupEntity.Children.AddRange(Children.Select(c => c.GetEntity()));
foreach (var child in Children)
child.ApplyToEntity();
}
internal override void Initialize(IDataModelService dataModelService)
{
foreach (var child in Children)
child.Initialize(dataModelService);
}
internal override DisplayConditionPartEntity GetEntity()
{
return DisplayConditionGroupEntity;
}
}
public enum BooleanOperator
{
And,
Or,
AndNot,
OrNot
}
}