static private void ValidateCondition(RSConditionData inCondition, RSValidationState ioState, RSValidationContext inContext) { ioState.PushContext("Query"); ValidateResolvableValue(inCondition.Query, null, RSValidationFlags.None.ForConditionQuery(), ioState, inContext); ioState.PopContext(); RSTypeInfo expectedType = inCondition.Query.TypeInfo(inContext.Trigger, inContext.Library); if (inCondition.Query.Mode != ResolvableValueMode.Value && expectedType != null) { ioState.PushContext("Operator"); CompareOperator op = inCondition.Operator; if (!expectedType.IsOperatorAllowed(op)) { ioState.Error("Operator {0} is not allowed for type {1}", op, expectedType); } ioState.PopContext(); if (op.IsBinary()) { ioState.PushContext("Target"); ValidateResolvableValue(inCondition.Target, expectedType, RSValidationFlags.None.ForConditionTarget(), ioState, inContext); ioState.PopContext(); } } }
public string GetPreviewString(RSTriggerInfo inTriggerContext, RSLibrary inLibrary) { using (PooledStringBuilder psb = PooledStringBuilder.Alloc()) { var sb = psb.Builder; if (!Enabled) { sb.Append("[Disabled] "); } sb.Append(Query.GetPreviewString(inTriggerContext, inLibrary)); sb.Append(" ").Append(Operator.Symbol()); if (Operator.IsBinary()) { sb.Append(" ").Append(Target.GetPreviewString(inTriggerContext, inLibrary)); } return(sb.ToString()); } }
/// <summary> /// Renders editor for condition info. /// </summary> static public void ConditionData(UndoTarget inUndo, RSConditionData ioCondition, RSValidationFlags inFlags, RSValidationContext inContext) { string preview = ioCondition.GetPreviewString(inContext.Trigger, inContext.Library); GUILayout.Label(preview, RSGUIStyles.RuleHeaderStyle); EditorGUILayout.Space(); // Enabled bool bEnabled = EditorGUILayout.Toggle(Content.ConditionEnabledLabel, ioCondition.Enabled); if (bEnabled != ioCondition.Enabled) { inUndo.MarkDirty("Changed Condition Enabled"); ioCondition.Enabled = bEnabled; } EditorGUILayout.Space(); using (new EditorGUI.DisabledGroupScope(!bEnabled)) { RSTypeInfo prevQueryType = ioCondition.Query.TypeInfo(inContext.Trigger, inContext.Library); // Query ResolvableValueData(inUndo, Content.ConditionValueLabel, ioCondition.Query, null, inFlags.ForConditionQuery(), inContext); // comparison RSTypeInfo queryTypeInfo = ioCondition.Query.TypeInfo(inContext.Trigger, inContext.Library); if (ioCondition.Query.Mode != ResolvableValueMode.Value && queryTypeInfo != null) { EditorGUILayout.Space(); RSEditorUtility.s_ComparisonOperators.Clear(); foreach (var comparison in queryTypeInfo.AllowedOperators()) { RSEditorUtility.s_ComparisonOperators.Add(comparison, comparison.Name(), (int)comparison); } CompareOperator nextOperator = ioCondition.Operator; if (!RSEditorUtility.s_ComparisonOperators.Contains(nextOperator)) { nextOperator = RSEditorUtility.s_ComparisonOperators.Get(0); } nextOperator = ListGUILayout.Popup(Content.ConditionComparisonLabel, nextOperator, RSEditorUtility.s_ComparisonOperators); if (nextOperator != ioCondition.Operator) { inUndo.MarkDirty("Changed Condition Operator"); ioCondition.Operator = nextOperator; } if (nextOperator.IsBinary()) { EditorGUILayout.Space(); if (prevQueryType != queryTypeInfo) { inUndo.MarkDirty("Changed Condition Query Type"); RSResolvableValueData.SetAsValue(ref ioCondition.Target, queryTypeInfo.DefaultValue); } ResolvableValueData(inUndo, Content.ConditionTargetLabel, ioCondition.Target, queryTypeInfo, inFlags.ForConditionTarget(), inContext); } else { if (ioCondition.Target != null) { inUndo.MarkDirty("Removed Condition Comparison Target"); ioCondition.Target = null; } } if (ioCondition.Query.IsMultiValue()) { EditorGUILayout.Space(); Subset subset = (Subset)EditorGUILayout.EnumPopup(Content.ConditionSubsetLabel, ioCondition.MultiQuerySubset); if (subset != ioCondition.MultiQuerySubset) { inUndo.MarkDirty("Changed Condition MultiQuerySubset"); ioCondition.MultiQuerySubset = subset; } } } } }