Esempio n. 1
0
        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();
                }
            }
        }
        private void RenderConditionListElement(Rect rect, int index, bool isActive, bool isFocused)
        {
            RSConditionData condition = m_SelectionState.Rule.Conditions[index];

            Rect labelRect = rect;

            labelRect.width -= CLONE_BUTTON_WIDTH + CLONE_BUTTON_SPACING;

            string labelText = condition.GetPreviewString(GetCurrentTrigger(), m_Context.Library);

            using (new RSGUI.ColorScope(condition.Enabled ? Color.white : Color.gray))
            {
                EditorGUI.LabelField(labelRect, labelText);
            }

            Rect cloneRect = rect;

            cloneRect.width   = CLONE_BUTTON_WIDTH;
            cloneRect.height -= 4;
            cloneRect.x       = labelRect.xMax + CLONE_BUTTON_SPACING;

            using (new EditorGUI.DisabledScope(EditorApplication.isPlaying))
            {
                if (GUI.Button(cloneRect, "Clone"))
                {
                    RSConditionData clone = condition.Clone();
                    InsertCondition(clone, index + 1);
                }
            }

            if (DetectContextClick(rect))
            {
                ShowConditionElementContextMenu(condition, index);
            }
        }
Esempio n. 3
0
        static public void CopyCondition(RSConditionData inConditionData)
        {
            Clear();

            s_CurrentTarget    = Target.Condition;
            s_CurrentCondition = inConditionData.Clone();
        }
Esempio n. 4
0
 static public void Clear()
 {
     s_CurrentTarget    = Target.None;
     s_CurrentRule      = null;
     s_CurrentCondition = null;
     s_CurrentAction    = null;
 }
Esempio n. 5
0
        /// <summary>
        /// Evaluates a condition.
        /// </summary>
        public bool EvaluateCondition(RSConditionData inCondition)
        {
            Assert.True(!inCondition.Target.IsMultiValue(), "Multi-target queries cannot be right-hand values for conditions");

            MultiReturn <RSValue> query = ResolveValue(inCondition.Query);
            RSValue         target      = ResolveValue(inCondition.Target).ForceSingle();
            CompareOperator op          = inCondition.Operator;

            if (query.Set != null)
            {
                Subset subset = inCondition.MultiQuerySubset;
                foreach (var check in query.Set)
                {
                    bool bPass = Evaluate(op, check, target);
                    switch (subset)
                    {
                    case Subset.All:
                    {
                        if (!bPass)
                        {
                            return(false);
                        }
                        break;
                    }

                    case Subset.Any:
                    {
                        if (bPass)
                        {
                            return(true);
                        }
                        break;
                    }

                    case Subset.None:
                    {
                        if (bPass)
                        {
                            return(false);
                        }
                        break;
                    }
                    }
                }

                switch (subset)
                {
                case Subset.All:
                case Subset.None:
                    return(true);

                default:
                    return(false);
                }
            }

            return(Evaluate(op, query.Single, target));
        }
Esempio n. 6
0
        static public void PasteCondition(RSConditionData ioTarget)
        {
            if (!HasCondition())
            {
                Debug.LogError("No condition copied");
                return;
            }

            ioTarget.CopyFrom(s_CurrentCondition);
        }
        private void OnAddNewCondition(ReorderableList list)
        {
            RSConditionData conditionData = new RSConditionData();
            int             index         = list.index;

            if (index >= 0)
            {
                ++index;
            }
            InsertCondition(conditionData, index);
        }
        private void InsertCondition(RSConditionData inCondition, int inIndex = -1)
        {
            m_TargetState.UndoTarget.MarkDirty("Added Condition", true);
            if (inIndex < 0 || inIndex >= m_SelectionState.Rule.Conditions.Length)
            {
                ArrayUtility.Add(ref m_SelectionState.Rule.Conditions, inCondition);
                inIndex = m_SelectionState.Rule.Conditions.Length - 1;
            }
            else
            {
                ArrayUtility.Insert(ref m_SelectionState.Rule.Conditions, inIndex, inCondition);
            }

            SelectCondition(inIndex);
        }
        private void ShowConditionElementContextMenu(RSConditionData inConditionData, int inIndex)
        {
            GenericMenu menu = new GenericMenu();

            menu.AddItem(s_ContextMenuCopyLabel, false, () => RSEditorClipboard.CopyCondition(inConditionData));
            if (RSEditorClipboard.HasCondition())
            {
                menu.AddItem(s_ContextMenuPasteOverwriteLabel, false, () =>
                {
                    m_TargetState.UndoTarget.MarkDirty("Paste condition (overwrite)");
                    RSEditorClipboard.PasteCondition(inConditionData);
                });
                if (EditorApplication.isPlaying)
                {
                    menu.AddDisabledItem(s_ContextMenuPasteInsertLabel, false);
                }
                else
                {
                    menu.AddItem(s_ContextMenuPasteInsertLabel, false, () =>
                    {
                        RSConditionData clone = RSEditorClipboard.PasteCondition();
                        InsertCondition(clone, inIndex + 1);
                    });
                }
            }
            else
            {
                menu.AddDisabledItem(s_ContextMenuPasteOverwriteLabel, false);
                menu.AddDisabledItem(s_ContextMenuPasteInsertLabel, false);
            }

            if (EditorApplication.isPlaying)
            {
                menu.AddDisabledItem(s_ContextMenuDeleteLabel, false);
            }
            else
            {
                menu.AddItem(s_ContextMenuDeleteLabel, false, () => DeleteCondition(inIndex));
            }

            menu.ShowAsContext();
        }
Esempio n. 10
0
        private void ShowConditionHeaderContextMenu()
        {
            GenericMenu menu = new GenericMenu();

            if (EditorApplication.isPlaying)
            {
                menu.AddDisabledItem(s_ContextMenuPasteAddToEndLabel, false);
                menu.AddDisabledItem(s_ContextMenuDeleteAllLabel, false);
            }
            else
            {
                if (RSEditorClipboard.HasCondition())
                {
                    menu.AddItem(s_ContextMenuPasteAddToEndLabel, false, () =>
                    {
                        RSConditionData clone = RSEditorClipboard.PasteCondition();
                        InsertCondition(clone, -1);
                    });
                }
                else
                {
                    menu.AddDisabledItem(s_ContextMenuPasteAddToEndLabel, false);
                }

                if (m_SelectionState.Rule.Conditions.Length > 0)
                {
                    menu.AddItem(s_ContextMenuDeleteAllLabel, false, () =>
                    {
                        SelectCondition(-1);
                        m_TargetState.UndoTarget.MarkDirty("Removed all Conditions", true);
                        m_SelectionState.Rule.Conditions = new RSConditionData[0];
                    });
                }
                else
                {
                    menu.AddDisabledItem(s_ContextMenuDeleteAllLabel, false);
                }
            }

            menu.ShowAsContext();
        }
Esempio n. 11
0
        /// <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;
                        }
                    }
                }
            }
        }
Esempio n. 12
0
        /// <summary>
        /// Evaluates a set of conditions.
        /// </summary>
        public bool EvaluateConditions(RSConditionData[] inConditions, Subset inSubset)
        {
            if (inConditions == null)
            {
                return(true);
            }

            int activeConditions = 0;

            for (int i = 0, numConditions = inConditions.Length; i < numConditions; ++i)
            {
                RSConditionData condition = inConditions[i];
                if (!condition.Enabled)
                {
                    continue;
                }

                ++activeConditions;
                bool bPass = EvaluateCondition(condition);
                switch (inSubset)
                {
                case Subset.All:
                {
                    if (!bPass)
                    {
                        return(false);
                    }
                    break;
                }

                case Subset.Any:
                {
                    if (bPass)
                    {
                        return(true);
                    }
                    break;
                }

                case Subset.None:
                {
                    if (bPass)
                    {
                        return(false);
                    }
                    break;
                }
                }
            }

            if (activeConditions == 0)
            {
                return(true);
            }

            switch (inSubset)
            {
            case Subset.All:
            case Subset.None:
                return(true);

            default:
                return(false);
            }
        }