Files
MovementTests/addons/forge/resources/ForgeQueryExpression.cs
Minimata c4be97e0de
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 21s
Create tag and build when new code gets to main / Test (push) Successful in 6m56s
Create tag and build when new code gets to main / Export (push) Successful in 9m3s
added forge addon
2026-02-08 15:16:01 +01:00

127 lines
3.2 KiB
C#

// Copyright © Gamesmiths Guild.
using System.Diagnostics;
using Gamesmiths.Forge.Godot.Core;
using Gamesmiths.Forge.Tags;
using Godot;
using Godot.Collections;
namespace Gamesmiths.Forge.Godot.Resources;
[Tool]
[GlobalClass]
[Icon("uid://dscm401i41h52")]
public partial class QueryExpression : Resource
{
private TagQueryExpressionType _expressionType;
[Export]
public TagQueryExpressionType ExpressionType
{
get => _expressionType;
set
{
_expressionType = value;
NotifyPropertyListChanged();
}
}
[Export]
public Array<QueryExpression>? Expressions { get; set; }
[Export]
public ForgeTagContainer? TagContainer { get; set; }
public override void _ValidateProperty(Dictionary property)
{
if ((ExpressionType == TagQueryExpressionType.Undefined || IsExpressionType())
&& property["name"].AsStringName() == PropertyName.TagContainer)
{
property["usage"] = (int)PropertyUsageFlags.NoEditor;
}
if ((ExpressionType == TagQueryExpressionType.Undefined || !IsExpressionType())
&& property["name"].AsStringName() == PropertyName.Expressions)
{
property["usage"] = (int)PropertyUsageFlags.NoEditor;
}
}
public bool IsExpressionType()
{
return ExpressionType == TagQueryExpressionType.AnyExpressionsMatch
|| ExpressionType == TagQueryExpressionType.AllExpressionsMatch
|| ExpressionType == TagQueryExpressionType.NoExpressionsMatch;
}
public TagQueryExpression GetQueryExpression()
{
TagContainer ??= new();
var expression = new TagQueryExpression(ForgeManagers.Instance.TagsManager);
switch (_expressionType)
{
case TagQueryExpressionType.AnyExpressionsMatch:
expression = expression.AnyExpressionsMatch();
AddExpressions(expression);
break;
case TagQueryExpressionType.AllExpressionsMatch:
expression = expression.AllExpressionsMatch();
AddExpressions(expression);
break;
case TagQueryExpressionType.NoExpressionsMatch:
expression = expression.NoExpressionsMatch();
AddExpressions(expression);
break;
case TagQueryExpressionType.AnyTagsMatch:
expression = expression.AnyTagsMatch();
expression.AddTags(TagContainer.GetTagContainer());
break;
case TagQueryExpressionType.AllTagsMatch:
expression = expression.AllTagsMatch();
expression.AddTags(TagContainer.GetTagContainer());
break;
case TagQueryExpressionType.NoTagsMatch:
expression = expression.NoTagsMatch();
expression.AddTags(TagContainer.GetTagContainer());
break;
case TagQueryExpressionType.AnyTagsMatchExact:
expression = expression.AnyTagsMatchExact();
expression.AddTags(TagContainer.GetTagContainer());
break;
case TagQueryExpressionType.AllTagsMatchExact:
expression = expression.AllTagsMatchExact();
expression.AddTags(TagContainer.GetTagContainer());
break;
case TagQueryExpressionType.NoTagsMatchExact:
expression = expression.NoTagsMatchExact();
expression.AddTags(TagContainer.GetTagContainer());
break;
}
return expression;
}
private void AddExpressions(TagQueryExpression expression)
{
Debug.Assert(
Expressions is not null,
$"{nameof(Expressions)} reference is missing.");
foreach (QueryExpression innerExpression in Expressions)
{
expression.AddExpression(innerExpression.GetQueryExpression());
}
}
}