Exemplo n.º 1
0
 /// <inheritdoc/>
 public bool ShowInInspector([NotNull] Type containingClassType, [CanBeNull] object containingClassInstance, [CanBeNull] MemberInfo classMember)
 {
     if (evaluator == null)
     {
         evaluator = EvaluationUtility.GenerateEvaluatorForBooleanExpression(expression);
     }
     return(evaluator.Evaluate(containingClassType, containingClassInstance, classMember));
 }
Exemplo n.º 2
0
        /// <summary>
        /// Only show the class member that follows this attribute if another class member
        /// by the name <paramref name="classMemberName"/> has the value of <paramref name="requiredValue"/>.
        /// </summary>
        /// <param name="classMemberName"> Name of another class member inside the same class as the class member with this attribute. </param>
        /// <param name="requiredValue"></param>
        public ShowIfAttribute(string classMemberName, string comparison, object requiredValue) : base()
        {
            expression = null;

            Is comparisonType;

            switch (comparison)
            {
            case "==":
                comparisonType = Is.Equal;
                break;

            case "!=":
                comparisonType = Is.Not;
                break;

            case "<":
                comparisonType = Is.Smaller;
                break;

            case "<=":
                comparisonType = Is.SmallerOrEqual;
                break;

            case ">":
                comparisonType = Is.Larger;
                break;

            case ">=":
                comparisonType = Is.LargerOrEqual;
                break;

            default:
                throw new Exception("Unrecognized comparison: \"" + comparison + "\". Accepted comparison values are: ==, !=, <, >, <= and >=.");
            }

            evaluator = new ValueTest(classMemberName, comparisonType, requiredValue);
        }
Exemplo n.º 3
0
        private static bool TryGenerateEvaluatorForExpressionWithoutParentheses(bool ifAny, string expression, out IShowIfEvaluator left)
        {
            left = null;
            var atomSeparator = ifAny ? '|' : '&';
            int end           = expression.IndexOf(atomSeparator);

            if (end == -1)
            {
                return(false);
            }

            int start = 0;

            do
            {
                string expressionAtom = expression.Substring(start, end - start);
                var    leafEvaluator  = GenerateEvaluatorForAtomicFormula(expressionAtom);
                if (left == null)
                {
                    left = leafEvaluator;
                }
                else
                {
                    left = new Expression(left, leafEvaluator, ifAny);
                }

                start = end + 1;
                end   = expression.IndexOf(atomSeparator, start + 1);
            }while(end != -1);

            if (start < expression.Length - 1)
            {
                string expressionAtom = expression.Substring(start);
                var    leafEvaluator  = GenerateEvaluatorForAtomicFormula(expressionAtom);
                if (left == null)
                {
                    left = leafEvaluator;
                }
                else
                {
                    left = new Expression(left, leafEvaluator, ifAny);
                }
            }

                        #if DEV_MODE && PI_ASSERTATIONS
            Debug.Assert(left != null);
                        #endif

            return(true);
        }
Exemplo n.º 4
0
        public static IShowIfEvaluator GenerateEvaluatorForBooleanExpression([NotNullOrEmpty] string expression)
        {
                        #if DEV_MODE && PI_ASSERTATIONS
            Debug.Assert(!string.IsNullOrEmpty(expression));
                        #endif

            IShowIfEvaluator cached;
            if (EvaluatorCache.TryGetValue(expression, out cached))
            {
                return(cached);
            }

            string rawInput = expression;
            expression = expression.Replace(" ", "").Replace("&&", "&").Replace("||", "|");

                        #if DEV_MODE
            Debug.Log("GenerateEvaluatorFromExpression: " + expression);
                        #endif

            IShowIfEvaluator left = null;
            bool             any  = false;

            int start = expression.LastIndexOf('(');
            if (start == -1)
            {
                left = GenerateEvaluatorForExpressionWithoutParentheses(expression);

                                #if DEV_MODE && PI_ASSERTATIONS
                Debug.Assert(left != null);
                                #endif

                EvaluatorCache.Add(rawInput, left);

                return(left);
            }

            for (; start != -1; start = expression.LastIndexOf('(', start - 1))
            {
                int    end = expression.IndexOf(')', start + 1);
                string expressionWithoutParentheses = expression.Substring(start + 1, end - start - 1);
                var    newEvaluator = GenerateEvaluatorForExpressionWithoutParentheses(expressionWithoutParentheses);
                if (left == null)
                {
                    left = newEvaluator;
                }
                else
                {
                    left = new Expression(left, newEvaluator, any);
                }

                if (start > 0)
                {
                    var c = expression[start - 1];
                    if (c == '|')
                    {
                        any = true;
                    }
                    else if (c == '&')
                    {
                        any = false;
                    }
                    else
                    {
                        c = expression[end + 1];
                        if (c == '|')
                        {
                            any = true;
                        }
                        else if (c == '&')
                        {
                            any = false;
                        }
                    }
                }
                else
                {
                    var c = expression[end + 1];
                    if (c == '|')
                    {
                        any = true;
                    }
                    else if (c == '&')
                    {
                        any = false;
                    }
                }
            }

            int firstStart = expression.IndexOf('(');
            if (firstStart > 0)
            {
                                #if DEV_MODE && PI_ASSERTATIONS
                Debug.Assert(left != null);
                                #endif

                any = expression[firstStart - 1] == '|';
                string expressionWithoutParentheses = expression.Substring(0, firstStart - 1);
                var    newEvaluator = GenerateEvaluatorForExpressionWithoutParentheses(expressionWithoutParentheses);
                left = new Expression(left, newEvaluator, any);
            }

            int lastEnd = expression.LastIndexOf(')');
            if (lastEnd < expression.Length - 1)
            {
                                #if DEV_MODE && PI_ASSERTATIONS
                Debug.Assert(left != null);
                                #endif

                any = expression[lastEnd + 1] == '|';
                string expressionWithoutParentheses = expression.Substring(lastEnd + 2);
                var    newEvaluator = GenerateEvaluatorForExpressionWithoutParentheses(expressionWithoutParentheses);

                left = new Expression(left, newEvaluator, any);
            }

                        #if DEV_MODE && PI_ASSERTATIONS
            Debug.Assert(left != null);
                        #endif

            EvaluatorCache.Add(rawInput, left);

            return(left);
        }
Exemplo n.º 5
0
 /// <summary>
 /// Only show the class member that follows this attribute if another class member
 /// by the name <paramref name="classMemberName"/> has the value of <paramref name="requiredValue"/>.
 /// </summary>
 /// <param name="classMemberName"> Name of another class member inside the same class as the class member with this attribute. </param>
 /// <param name="requiredValue"></param>
 public ShowIfAttribute(string classMemberName, Is comparison, object requiredValue) : base()
 {
     evaluator  = new ValueTest(classMemberName, comparison, requiredValue);
     expression = null;
 }
Exemplo n.º 6
0
        public bool ShowInInspector([NotNull] Type containingClassType, [CanBeNull] object containingClassInstance, [CanBeNull] MemberInfo classMember)
        {
            if (alwaysShow)
            {
                return(true);
            }

            if (evaluatorExpression != null)
            {
                if (evaluator == null)
                {
                    evaluator = EvaluationUtility.GenerateEvaluatorForBooleanExpression(evaluatorExpression);
                }
                return(evaluator.Evaluate(containingClassType, containingClassInstance, classMember));
            }

            if (!string.IsNullOrEmpty(classMemberName))
            {
                var classMembers = containingClassType.GetMember(classMemberName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);

                int classMembersFound = classMembers.Length;

                if (classMembersFound == 0)
                {
                    Debug.LogError("HelpBoxAttribute class member by name \"" + classMemberName + "\" not found.");
                    return(true);
                }

                classMember = classMembers[0];
            }

            var    field = classMember as FieldInfo;
            object currentValue;
            Type   classMemberType;

            if (field is object)
            {
                classMemberType = field.FieldType;
                currentValue    = field.GetValue(field.IsStatic ? null : containingClassInstance);
            }
            else
            {
                var property = classMember as PropertyInfo;
                if (property is object)
                {
                    classMemberType = property.PropertyType;
                    var getAccessor = property.GetGetMethod();
                    currentValue = getAccessor.Invoke(getAccessor.IsStatic ? null : containingClassInstance, null);
                }
                else
                {
                    Debug.LogError("ShowInInspectorIfAttribute class member by name \"" + classMemberName + "\" was not a field or a property.");
                    return(true);
                }
            }

                        #if DEV_MODE
            Debug.Log("Show if \"" + classMemberName + "\" value (" + (currentValue == null ? "null" : currentValue.ToString()) + ") " + comparisonType + " " + (requiredValue == null ? "null" : requiredValue.ToString()));
                        #endif

            return(EvaluationUtility.Test(currentValue, comparisonType, requiredValue));
        }
Exemplo n.º 7
0
 public Expression(IShowIfEvaluator setLeft, IShowIfEvaluator setRight, bool setAny)
 {
     left  = setLeft;
     right = setRight;
     any   = setAny;
 }
Exemplo n.º 8
0
 public Negation(IShowIfEvaluator setExpressionToNegate)
 {
     expressionToNegate = setExpressionToNegate;
 }
Exemplo n.º 9
0
 /// <summary>
 /// Show the class member that follows this attribute as disabled (read-only) if class member
 /// by the name <paramref name="classMemberName"/> has the value of <paramref name="requiredValue"/>.
 /// </summary>
 /// <param name="classMemberName"> Name of another class member inside the same class as the class member with this attribute. </param>
 /// <param name="requiredValue"></param>
 public DisableIfAttribute(string classMemberName, object requiredValue) : base()
 {
     evaluator  = new ValueTest(classMemberName, Is.Equal, requiredValue);
     expression = null;
 }