Esempio n. 1
0
 protected override string Label(bool human)
 {
     return(UnityAPI.Await(() =>
     {
         var macro = (UnityObject)unit.nest.macro;
         return macro != null ? macro.name : BoltFlowNameUtility.UnitTitle(unit.GetType(), false, false);
     }));
 }
Esempio n. 2
0
        protected override string DefinedSurtitle()
        {
            var hasCurrentTitle = !StringUtility.IsNullOrWhiteSpace(unit.nest.graph?.title);
            var hasMacroTitle   = unit.nest.source == GraphSource.Macro && (UnityObject)unit.nest.macro != null;

            return(hasCurrentTitle || hasMacroTitle
                ? BoltFlowNameUtility.UnitTitle(unitType, false, false)
                : null);
        }
Esempio n. 3
0
        private static UnitDescription FetchReflectedDescription(Type unitType)
        {
            var oldName = BoltFlowNameUtility.UnitPreviousTitle(unitType);
            var prefix  = string.IsNullOrEmpty(oldName) ? string.Empty : $"(Previously named {oldName}) ";

            return(new UnitDescription()
            {
                title = BoltFlowNameUtility.UnitTitle(unitType, false, true),
                shortTitle = BoltFlowNameUtility.UnitTitle(unitType, true, true),
                surtitle = unitType.GetAttribute <UnitSurtitleAttribute>()?.surtitle,
                subtitle = unitType.GetAttribute <UnitSubtitleAttribute>()?.subtitle,
                summary = prefix + unitType.Summary()
            });
        }
Esempio n. 4
0
 protected override string DefinedTitle()
 {
     return(GraphNesterDescriptor.Title(unit, BoltFlowNameUtility.UnitTitle(unitType, false, false)));
 }
Esempio n. 5
0
 protected virtual string Label(bool human)
 {
     return(BoltFlowNameUtility.UnitTitle(unitType, false, true));
 }
Esempio n. 6
0
        protected virtual IEnumerable <Warning> Warnings()
        {
            var isEntered = IsEntered();

            if (!unit.isDefined)
            {
                if (unit.definitionException != null)
                {
                    yield return(Warning.Exception(unit.definitionException));
                }
                else if (!unit.canDefine)
                {
                    yield return(Warning.Caution("Unit is not properly configured."));
                }
            }

            if (!isEntered)
            {
                yield return(Warning.Info("Unit is never entered."));
            }

            // Obsolete attribute is not inherited, so traverse the chain manually
            var obsoleteAttribute = unit.GetType().AndHierarchy().FirstOrDefault(t => t.HasAttribute <ObsoleteAttribute>())?.GetAttribute <ObsoleteAttribute>();

            if (obsoleteAttribute != null)
            {
                var unitName = BoltFlowNameUtility.UnitTitle(unit.GetType(), true, false);

                if (obsoleteAttribute.Message != null)
                {
                    Debug.LogWarning($"\"{unitName}\" unit is deprecated: {obsoleteAttribute.Message}");
                    yield return(Warning.Caution($"Deprecated: {obsoleteAttribute.Message}"));
                }
                else
                {
                    Debug.LogWarning($"\"{unitName}\" unit is deprecated.");
                    yield return(Warning.Caution("This unit is deprecated."));
                }
            }

            if (unit.isDefined)
            {
                foreach (var invalidInput in unit.invalidInputs)
                {
                    yield return(Warning.Caution($"{PortLabel(invalidInput)} is not used by this unit."));
                }

                foreach (var invalidOutput in unit.invalidOutputs)
                {
                    yield return(Warning.Caution($"{PortLabel(invalidOutput)} is not provided by this unit."));
                }

                foreach (var validPort in unit.validPorts)
                {
                    if (validPort.hasInvalidConnection)
                    {
                        yield return(Warning.Caution($"{PortLabel(validPort)} has an invalid connection."));
                    }
                }
            }

            foreach (var controlInput in unit.controlInputs)
            {
                if (!controlInput.hasValidConnection)
                {
                    continue;
                }

                foreach (var relation in controlInput.relations)
                {
                    if (relation.source is ValueInput)
                    {
                        var valueInput = (ValueInput)relation.source;

                        foreach (var warning in ValueInputWarnings(valueInput))
                        {
                            yield return(warning);
                        }
                    }
                }
            }

            foreach (var controlOutput in unit.controlOutputs)
            {
                if (!controlOutput.hasValidConnection)
                {
                    continue;
                }

                var controlInputs = controlOutput.relations.Select(r => r.source).OfType <ControlInput>();

                var isTriggered = !controlInputs.Any() || controlInputs.Any(ci => !ci.isPredictable || ci.couldBeEntered);

                foreach (var relation in controlOutput.relations)
                {
                    if (relation.source is ValueInput)
                    {
                        var valueInput = (ValueInput)relation.source;

                        foreach (var warning in ValueInputWarnings(valueInput))
                        {
                            yield return(warning);
                        }
                    }
                }

                if (isEntered && !isTriggered)
                {
                    yield return(Warning.Caution($"{PortLabel(controlOutput)} is connected, but it is never triggered."));
                }
            }

            foreach (var valueOutput in unit.valueOutputs)
            {
                if (!valueOutput.hasValidConnection)
                {
                    continue;
                }

                foreach (var relation in valueOutput.relations)
                {
                    if (relation.source is ControlInput)
                    {
                        var controlInput = (ControlInput)relation.source;

                        if (isEntered && controlInput.isPredictable && !controlInput.couldBeEntered)
                        {
                            yield return(Warning.Severe($"{PortLabel(controlInput)} is required, but it is never entered."));
                        }
                    }
                    else if (relation.source is ValueInput)
                    {
                        var valueInput = (ValueInput)relation.source;

                        foreach (var warning in ValueInputWarnings(valueInput))
                        {
                            yield return(warning);
                        }
                    }
                }
            }
        }
        protected virtual IEnumerable <Warning> Warnings()
        {
            var isEntered = IsEntered();

            if (!unit.isDefined)
            {
                if (unit.definitionException != null)
                {
                    yield return(Warning.Exception(unit.definitionException));
                }
                else if (!unit.canDefine)
                {
                    yield return(Warning.Caution("Node is not properly configured."));
                }
            }

            if (!isEntered)
            {
                yield return(Warning.Info("Node is never entered."));
            }

            // Obsolete attribute is not inherited, so traverse the chain manually
            var obsoleteAttribute = unit.GetType().AndHierarchy().FirstOrDefault(t => t.HasAttribute <ObsoleteAttribute>())?.GetAttribute <ObsoleteAttribute>();

            if (obsoleteAttribute != null)
            {
                var unitName = BoltFlowNameUtility.UnitTitle(unit.GetType(), true, false);

                if (obsoleteAttribute.Message != null)
                {
                    Debug.LogWarning($"\"{unitName}\" node is deprecated: {obsoleteAttribute.Message}");
                    yield return(Warning.Caution($"Deprecated: {obsoleteAttribute.Message}"));
                }
                else
                {
                    Debug.LogWarning($"\"{unitName}\" node is deprecated.");
                    yield return(Warning.Caution("This node is deprecated."));
                }
            }

            if (unit.isDefined)
            {
                foreach (var invalidInput in unit.invalidInputs)
                {
                    yield return(Warning.Caution($"{PortLabel(invalidInput)} is not used by this unit."));
                }

                foreach (var invalidOutput in unit.invalidOutputs)
                {
                    yield return(Warning.Caution($"{PortLabel(invalidOutput)} is not provided by this unit."));
                }

                foreach (var validPort in unit.validPorts)
                {
                    if (validPort.hasInvalidConnection)
                    {
                        yield return(Warning.Caution($"{PortLabel(validPort)} has an invalid connection."));
                    }
                }

#if UNITY_IOS || UNITY_ANDROID || UNITY_TVOS
                if (unit is IMouseEventUnit)
                {
                    var graphName = string.IsNullOrEmpty(unit.graph.title) ? "A ScriptGraph" : $"The ScriptGraph {unit.graph.title}";
                    var unitName  = BoltFlowNameUtility.UnitTitle(unit.GetType(), true, false);
                    Debug.LogWarning($"{graphName} contains a {unitName} node. Presence of MouseEvent nodes might impact performance on handheld devices.");
                    yield return(Warning.Caution("Presence of MouseEvent nodes might impact performance on handheld devices."));
                }
#endif
            }

            foreach (var controlInput in unit.controlInputs)
            {
                if (!controlInput.hasValidConnection)
                {
                    continue;
                }

                foreach (var relation in controlInput.relations)
                {
                    if (relation.source is ValueInput)
                    {
                        var valueInput = (ValueInput)relation.source;

                        foreach (var warning in ValueInputWarnings(valueInput))
                        {
                            yield return(warning);
                        }
                    }
                }
            }

            foreach (var controlOutput in unit.controlOutputs)
            {
                if (!controlOutput.hasValidConnection)
                {
                    continue;
                }

                var controlInputs = controlOutput.relations.Select(r => r.source).OfType <ControlInput>();

                var isTriggered = !controlInputs.Any() || controlInputs.Any(ci => !ci.isPredictable || ci.couldBeEntered);

                foreach (var relation in controlOutput.relations)
                {
                    if (relation.source is ValueInput)
                    {
                        var valueInput = (ValueInput)relation.source;

                        foreach (var warning in ValueInputWarnings(valueInput))
                        {
                            yield return(warning);
                        }
                    }
                }

                if (isEntered && !isTriggered)
                {
                    yield return(Warning.Caution($"{PortLabel(controlOutput)} is connected, but it is never triggered."));
                }
            }

            foreach (var valueOutput in unit.valueOutputs)
            {
                if (!valueOutput.hasValidConnection)
                {
                    continue;
                }

                foreach (var relation in valueOutput.relations)
                {
                    if (relation.source is ControlInput)
                    {
                        var controlInput = (ControlInput)relation.source;

                        if (isEntered && controlInput.isPredictable && !controlInput.couldBeEntered)
                        {
                            yield return(Warning.Severe($"{PortLabel(controlInput)} is required, but it is never entered."));
                        }
                    }
                    else if (relation.source is ValueInput)
                    {
                        var valueInput = (ValueInput)relation.source;

                        foreach (var warning in ValueInputWarnings(valueInput))
                        {
                            yield return(warning);
                        }
                    }
                }
            }
        }
Esempio n. 8
0
 public EventLine(Type eventType)
 {
     content = new GUIContent(BoltFlowNameUtility.UnitTitle(eventType, false, true), eventType.Icon()?[IconSize.Small]);
 }