mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
88 lines
3.1 KiB
C#
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
|
|
}
|
|
} |